浏览 3013 次
锁定老帖子 主题:NIO学习笔记3(UDP)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2013-01-28
NIO同样支持udp协议,不过相关的方法调用是有区别的 java的udp端口类是DatagramSocket 因此对应的nio channel类就是DatagramChannel 由于udp是一个无连接的协议,因此服务器端和客户端的代码基本相同。实际上服务器和客户端之间并没有太大区分。所以不存在ServerDatagramChannel这种玩意了,服务器端和客户端都是创建一个DatagramChannel。然后bind一个端口,注册Selector之后就可以打开监听了。 注意和SocketChannel的区别有以下几点: 接收数据:SocketChannel的方法是 ByteBuffer buffer = ByteBuffer.allocate(500); int readCount = socketChannel.read(buffer); 虽然DatagramChannel也有read(ByteBuffer buffer)这个方法,但是直接调用只会抛出异常。 接收数据包的正确姿势如下: ByteBuffer buffer = ByteBuffer.allocate(500); InetSocketAddress = (InetSocketAddress)datagramChannel.receive(buffer); 此方法直接返回一个SocketAddress对象,包含了数据来源的地址和端口,在反馈数据的时候就有大用处了。于此同时,datagramChannel.getRemoteAddress()方法自然是不可能有正确结果的,没有连接是不会有Remote Address的啦 同理,发送数据包的姿势也变了 原来的方式是: socketChannel.write(ByteBuffer.wrap("test data".getBytes())); 由于udp的无连接属性,此方法会让系统一头雾水的,我们需要加上发送的目标地址: datagramChannel.send(ByteBuffer.wrap("test data".getBytes()),new InetAddressSocket("localhost",12345)); 注意的是与TCP基于字节流的协议不同,udp是以数据报为单位单独发送的,因此一个数据包的大小不应过大。 可通过的数据报大小由整个路径中最小的MTU决定。 [linux中可以使用ifconfig命令轻松查询到自己系统的MTU] 默认局域网MTU大小是1500字节,注意要自行减去IP数据报头20字节的占用,另外udp报头还有8个字节,也就是只有1472个字节是我们可以支配的。 超出MTU的部分会由系统进行分片处理,到达目标后再自动组装回来。但是由于udp不保证传输质量,一旦分片后某一片丢失会直接导致整个数据报被丢弃。尽管使用udp并不要求数据100%送达,但在数据完整度方面还是尽可能做到更好。 注意PPPOE/ADSL的MTU默认值是1492字节(可支配1464) 而Internet标准MTU是576字节(可支配548) 如果使用udp协议传输的数据需要经过外网,还是定义在548字节以内最佳 今天的总结就写到这里,如有谬误欢迎指正 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |