interfaces which it implements): int read(bytebuffer) throws IOException; int read(bytebuffer[] buffers) throws IOException; int read(bytebuffer[] buf

Similar documents
JavaIO.PDF

Chapter 9: Objects and Classes

Java

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

chp6.ppt

untitled

Microsoft Word - 01.DOC

Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream Class java.io.datainptstream (extends) FilterInputStream InputStream Obj

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

Chapter 9: Objects and Classes

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

Go构建日请求千亿微服务最佳实践的副本

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

IoC容器和Dependency Injection模式.doc

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

untitled

/ / (FC 3)...

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

untitled

Chapter #


Guava学习之Resources

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

EJB-Programming-4-cn.doc

C6_ppt.PDF

(6) 要 求 付 款 管 理 员 从 预 订 表 中 查 询 距 预 订 的 会 议 时 间 两 周 内 的 预 定, 根 据 客 户 记 录 给 满 足 条 件 的 客 户 发 送 支 付 余 款 要 求 (7) 支 付 余 款 管 理 员 收 到 客 户 余 款 支 付 的 通 知 后, 检

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

(Microsoft Word - \272\364\263q\245|\244A_ _\304\254\253\330\336\263__\272\353\302\262\263\370\247i.doc)

財金資訊-80期.indd

提纲 1 2 OS Examples for 3

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

EJB-Programming-3.PDF

其中有些限制比现实更常出现. 数据报模型非常适合这样的应用程序 : (a) 请求 - 回复的交易 (FIXME:Transactions are request-reply). (b) 负载比较小. (c) 服务器是无连接的. (d) 事务是幂等的 (FIXME:Transactions are i

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

4.1 AMI MQSeries API AMI MQI AMI / / AMI JavaC C++ AMI / AMI AMI - / /

Microsoft PowerPoint - ch6 [相容模式]

基于CDIO一体化理念的课程教学大纲设计

Bus Hound 5

untitled

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

全国计算机技术与软件专业技术资格(水平)考试

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

untitled

基于ECO的UML模型驱动的数据库应用开发1.doc

CC213

JBuilder Weblogic

概述

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

Servlet

C/C++ - 文件IO

《大话设计模式》第一章

FileMaker 15 ODBC 和 JDBC 指南

2. AOP 底层技术实现 小风 Java 实战系列教程 关键词 : 代理模式 代理模型分为两种 : 1) 接口代理 (JDK 动态代理 ) 2) 子类代理 (Cglib 子类代理 ) 需求 :CustomerService 业务类, 有 save,update 方法, 希望在 save,updat

使用MapReduce读取XML文件

(京)新登字063号

untitled

IP Access Lists IP Access Lists IP Access Lists

D getinitparameternames() 9 下 列 选 项 中, 属 于 Servlet API 中 提 供 的 request 对 象 的 包 装 类 的 是 ( ) A HttpServletRequestWrapper B HttpServletRequest C HttpServ

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

(Methods) Client Server Microsoft Winsock Control VB 1 VB Microsoft Winsock Control 6.0 Microsoft Winsock Control 6.0 1(a). 2

Oracle 4

W. Richard Stevens UNIX Sockets API echo Sockets TCP OOB IO C struct C/C++ UNIX fork() select(2)/poll(2)/epoll(4) IO IO CPU 100% libevent UNIX CPU IO

3.1 num = 3 ch = 'C' 2

untitled

untitled

FileMaker 16 ODBC 和 JDBC 指南

计 算 机 系 统 应 用 年 第 25 卷 第 4 期 线 程 的 复 用 [2,3]. 通 常 情 况 下, 服 务 器 端 程 序 在 启 动 时 创 建 若 干 数 量 的 线 程 对 象 并 缓 存 起 来, 此 时 它 们 处 于

AN INTRODUCTION TO PHYSICAL COMPUTING USING ARDUINO, GRASSHOPPER, AND FIREFLY (CHINESE EDITION ) INTERACTIVE PROTOTYPING

( 总 第 1073 期 ) 浙 江 省 人 民 政 府 主 办 2015 年 3 月 17 日 出 版 省 政 府 令 省 政 府 文 件 目 录 浙 江 省 大 型 群 众 性 活 动 安 全 管 理 办 法 ( 浙 江 省 人 民 政 府 令 第 333 号 ) (3) 浙 江 省 人 民 政

Learning Java

C语言的应用.PDF

RunPC2_.doc

Microsoft Word - ch04三校.doc

T

提问袁小兵:

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Microsoft Word - 11.doc

穨control.PDF

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题

USING MAYA ANIMATION Keyset set Maya sets partitions MEL MEL copykey cutkey pastekey scalekey snapkey keytangent bakeresults MEL Command Reference Edi

构建 Bluetooth 移动应用 主讲人 : 任凯 微信 :kaiser-tech 2016 年 5 月 6 日 3

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

ch08.PDF

1.5招募说明书(草案)

電機工程系認可證照清單 /7/1

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

java2d-4.PDF

27 :OPC 45 [4] (Automation Interface Standard), (Costom Interface Standard), OPC 2,,, VB Delphi OPC, OPC C++, OPC OPC OPC, [1] 1 OPC 1.1 OPC OPC(OLE f

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

AL-M200 Series

新版 明解C++入門編

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

云数据库 RDS SDK

javaexample-02.pdf

投影片 1

Swing-02.pdf

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

Transcription:

这章讨论了 JDK 1.4 UDP 数据报可伸缩 I/O 的使用. 10.1 UDP 的通道 在 UDP 之上的可伸缩 I/O 使用我们在之前 4.2.1 节所遇到的 DatagramChannel 类执行. 10.1.1 导入语句下面的 Java 导入语句假设在这章的示例中至始至终存在. import java.io.*; import java.net.*; import java.nio.*; import java.nio.channels.*; import java.util.*; 10.1.2 创建一个 DatagramChannel DatagramChannel 类有和我们之前已经遇到的 SocketChannel 一样的打开和关闭方法 : static DatagramChannel open() throws IOException boolean isopen(); void close() throws IOException; 打开一个 DatagramChannel 返回一个阻塞模式的通道并可准备来使用. 它的套接字可以绑定如果需要的话 如 9.3.5 节所讨论的. 通道必须被关闭当它结束的时候. 警告 (Caveat): 见 5.2.5 节的关于关闭注册的通道的说明, 同样适用于 DatagramChannel. 10.1.3 连接操作 DatagramChannel 可以被直接连接和断开, 和通过它的 DatagramSocket 一样 : DatagramChannel connect(socketaddress target) throws IOException; DatagramChannel disconnect() throws IOException; boolean isconnected(); 这些方法操作等同于 DatagramSocket 一致的方法. 不像 SocketChannel 的连接方法,connect 方法不是 一个 UDP 套接字连接操作的非阻塞版本 :DatagramChannel.connect 和 DatagramSocket.connect 语义上是相同的. isconnected 方法判断本地套接字是否已经连接上. 如我们在 9.3.7 看到的, 连接一个数据报套接字仅仅是一个本地的操作而没有设计网络, 也就是说, 没有什么去阻塞. 10.2 DatagramChannel I/O DatagramChannel 有我们已经在 4.2.2 节看到的读和写操作,(FIXME:as required by the

interfaces which it implements): int read(bytebuffer) throws IOException; int read(bytebuffer[] buffers) throws IOException; int read(bytebuffer[] buffers, int offset, int length) throws IOException; int write(bytebuffer) throws IOException; int write(bytebuffer[] buffers)throws IOException; int write(bytebuffer[] buffers, int offset, int length) throws IOException; 现在, 这个 API 完全不同于 (FIXME:the DatagramPacket-orirnted API exported by the DatagramSocket class) 在 9.4.1 节和 9.4.2 节描述的. 特别是, 没有地方去指定一个输出套接字的目的地址, 或者指定一个传入的数据报的接收的源地址. 因为这个原因,read 和 write 方法在 DatagramChannel 受限 于一个重要的语义约束 : 如果关联的套接字连接了如 9.3.7 节定义的, 它们才能被使用. 在这种情况下, 一个接收或者发送的数据包的源或者目标地址只能是连接的套接字, 所以上面的读 / 写 API 是适合的. 为了处理未连接的数据报套接字,DatagramChannel 提供了两个新的方法 : SocketAddress receive(bytebuffer buffer) throws IOException; int send(bytebuffer buffer, SocketAddress target) throws IOException; 这些分别对应于 DatagramSocket.receive 和 DatagramSocket.send 方法.DatagramChannel.send 的 target 参数是传输的远程目标.DatagramChannel.receive 的返回值为 SocketAddress, 如我们在 2.2 节看到的, 代表了传输的远程源. 10.2.1 阻塞的 UDP I/O 如我们在 10.1 节看到的, 一个 DatagramChannel 以阻塞模式创建. 在这种模式下 : (a) 一个读操作阻塞直到一个传入的数据报已经接收到套接字接收缓冲区, 如果没有任何东西存在. (b) 一个写操作阻塞直到空间可用使在套接字发送缓冲区中的输出数据报排队, 也就是说, 直到有足够的数据报预先传输到网络上排队 : 这将延迟, 如果发生的话, 它通常非常短暂. 由于数据报以最大的速录传输. 10.2.2 非阻塞的 UDP I/O 一个 DatagramChannel 可被放置于非阻塞模式 : SelectableChannel configureblocking(boolean block) throws IOException; boolean isblocking(); 在非阻塞模式中,write 和 send 方法可以返回 0, 表明套接字发送缓冲区已经满了, 没有传输可以被执行 ; 类似的,read 和 receive 方法可以分别返回 0 或者 null, 表明没有数据报可用. 一个简单的非阻塞的 UDP I/O 顺序再示例 10.1 中说明. ByteBuffer buffer = ByteBuffer.allocate(8192); DatagramChannel channel= DatagramChannel.open(); channel.configureblocking(false); SocketAddress address

= new InetSocketAddress( localhost, 7); buffer.put( ); while (channel.send(buffer, address) == 0) ; // do something useful while ((address = channel.receive(buffer)) == null) ; // do something useful Example 10.1 简单的非阻塞的 UDP 客户端 I/O 如注释所说, 程序应该做一些有用的工作或者休眠而不是无知的自旋 (FIXME:spinning mindlessly) 当 I/O 传输返回 0 的时候. 10.3 多路复用 10.3.1 UDP 中的可伸缩 中的可伸缩 I/O 操作 UDP 中的可伸缩 I/O 操作都适用于 DatagramChannel 对象. 它们的 ' 准备 ' 状态的含义在表 10.1 展示. 操作 含义 表 10.1 UDP 中的可伸缩 I/O 操作 OP_READ 数据存在于套接字接收缓冲区中或者异常挂起. 在套接字发送缓冲区中存在空间或者异常挂起. 在 UDP 中,OP_WRITE 几乎总是准备好除了在套接字发送缓冲区中没有空间可用的期间 OP_WRITE. 最后只注册 OP_WRITE 一旦这个缓冲区满的条件被探测到, 也就是说, 当一个通道写返回少于请求的写的长度, 注销 OP_WRITE 一旦它被清理了, 也就是说, 一个通道写完全成功了. 10.3.2 多路复用 I/O 一个 DatagramChannel 可以使用一个选择器注册, 调用 Selector.select 方法去等待通道的可读或者可 写, 如 10.3.1 节讨论的 : DatagramChannelchannel = DatagramChannel.open(); // bind to port 1100 channel.bind(new InetSocketAddress(1100)); Selector selector = Selector.open(); // register for OP_READ channel.register(selector, SelectionKey.OP_READ); // Select selector.select(); 10.3.3 示例一个简单的多路复用 UDP echo 服务器在示例 10.2 中展示 ( 书中写的是 List<Datagram>, 正确的应该是 List<DatagramPacket>). public class NIOUDPEchoServer implements Runnable { static final int TIMEOUT = 5000;// 5s private ByteBuffer buffer = ByteBuffer.allocate(8192); private DatagramChannel channel; private List<DatagramPacket> outputqueue = new LinkedList<DatagramPacket>();

// Create new NIOUDPEchoServer public NIOUDPEchoServer(int port) throws IOException { this.channel = DatagramChannel.open(); channel.socket().bind(new InetSocketAddress(port)); channel.configureblocking(false); // Runnable. run method @Override public void run() { Selector selector = Selector.open(); channel.register(selector, SelectionKey.OP_READ); // loop while there are any registered channels while (!selector.keys().isempty()) { int keysadded = selector.select(timeout); // Standard post-select processing Set selectedkeys = selector.selectedkeys(); synchronized (selectedkeys) { Iterator it = selectedkeys.iterator(); while (it.hasnext()) { SelectionKey key = (SelectionKey) it.next(); it.remove(); if (!key.isvalid()) continue; if (key.isreadable()) handlereadable(key); if (key.iswritable()) handlewritable(key); // while // synchronized // while // try catch (IOException e) { // handle readable key void handlereadable(selectionkey key) { DatagramChannel channel = (DatagramChannel) key.channel(); SocketAddress address = channel.receive(buffer); if (address == null) return; // no data channel.send(buffer, address); int count = buffer.remaining();

if (count > 0) { // Write failure: queue the write request // as a DatagramPacket, as this nicely holds // the data and reply address byte[] bytes = new byte[count]; buffer.get(bytes); outputqueue.add(new DatagramPacket(bytes, count, address)); // Register for OP_WRITE key.interestops(selectionkey.op_read SelectionKey.OP_WRITE); catch (IOException e) { // handlereadable() // handle writable key void handlewritable(selectionkey key) { DatagramChannel channel = (DatagramChannel) key.channel(); while (!outputqueue.isempty()) { DatagramPacket packet = outputqueue.get(0); buffer.put(packet.getdata()); channel.send(buffer, packet.getsocketaddress()); if (buffer.hasremaining()) // write failed, retry return; outputqueue.remove(0); // All writes succeeded & queue empty, so // deregister for OP_WRITE key.interestops(selectionkey.op_read); catch (IOException e) { // handlewritable() // end of NIOUDPEchoServer 这个服务器永远不会在 I/O 操作中阻塞, 只有在 Selector.select 中. 如我们在 9.2.1 节看到的, 它比 TCP 服 务器简单点, 不必去管理客户端连接. 在多路复用 I/O, 这个意味着它不必去管理 SelectionKey.isAcceptable 的情况, 或者处理其它的套接字的连接. 它需要去管理输出队列包含了数据和目标地址. 幸运地是,java.net.DatagramPacket 类恰好包含了这些数据项目已经被传递.