`
jguangyou
  • 浏览: 369014 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java NIO框架Netty教程(四) ChannelBuffer(转)

 
阅读更多

在学字符串消息收发(http://www.it165.net/pro/html/201207/3174.html)的时候,已经提到过。ChannelBuffer是Netty中非常重要的概念。所有消息的收发都依赖于这个Buffer。我们通过Netty的官方的文档来了解一下,基于流的消息传递机制。

 

In a stream-based transport such as TCP/IP, received data is stored into a socket receive buffer.
Unfortunately, the buffer of a stream-based transport is not a queue of packets but a queue of bytes. It
means, even if you sent two messages as two independent packets, an operating system will not treat them
as two messages but as just a bunch of bytes. Therefore, there is no guarantee that what you read is exactly
what your remote peer wrote. For example, let us assume that the TCP/IP stack of an operating system has
received three packets:
+—–+—–+—–+
| ABC | DEF | GHI |
+—–+—–+—–+
Because of this general property of a stream-based protocol, there's high chance of reading them in the
following fragmented form in your application:
+—-+——-+—+—+
| AB | CDEFG | H | I |
+—-+——-+—+—+
Therefore, a receiving part, regardless it is server-side or client-side, should defrag the received data into one
or more meaningful frames that could be easily understood by the application logic. In case of the example
above, the received data should be framed like the following:
+—–+—–+—–+
| ABC | DEF | GHI |
+—–+—–+—–+

 

 

不知道您理解了没,简单翻译一下就是说。在TCP/IP这种基于流传递的协议中。他识别的不是你每一次发送来的消息,不是分包的。而是,只认识一个整体的流,即使分三次分别发送三段话:ABC、DEF、GHI。在传递的过程中,他就是一个具有整体长度的流。在读流的过程中,如果我一次读取的长度选择的不是三个,我可以收到类似AB、CDEFG、H、I这样的信息。这显然是我们不想看到的。所以说,在你写的消息收发的系统里,需要预先定义好这种解析机制,规定每帧(次)读取的长度。通过代码来理解一下:

 

/** 

* @author lihzh 

* @alia OneCoder 

* @blog http://www.it165.net 

*/

public class ServerBufferHandler extends SimpleChannelHandler { 

 

/** 

* 用户接受客户端发来的消息,在有客户端消息到达时触发 

* 

* @author lihzh 

* @alia OneCoder 

*/

@Override

public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { 

ChannelBuffer buffer = (ChannelBuffer) e.getMessage(); 

// 五位读取 

while (buffer.readableBytes() >= 5) { 

ChannelBuffer tempBuffer = buffer.readBytes(5); 

System.out.println(tempBuffer.toString(Charset.defaultCharset())); 

} 

// 读取剩下的信息 

System.out.println(buffer.toString(Charset.defaultCharset())); 

} 

 

}




w source

nt?

/** 

* @author lihzh 

* @alia OneCoder 

* @blog http://www.it165.net 

*/

public class ClientBufferHandler extends SimpleChannelHandler { 

 

/** 

* 当绑定到服务端的时候触发,给服务端发消息。 

* 

* @alia OneCoder 

* @author lihzh 

*/

@Override

public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) { 

// 分段发送信息 

sendMessageByFrame(e); 

} 

 

/** 

* 将<b>"Hello, I'm client."</b>分成三份发送。 <br> 

* Hello, <br> 

* I'm<br> 

* client.<br> 

* 

* @param e 

*            Netty事件 

* @author lihzh 

*/

private void sendMessageByFrame(ChannelStateEvent e) { 

String msgOne = "Hello, "; 

String msgTwo = "I'm "; 

String msgThree = "client."; 

e.getChannel().write(tranStr2Buffer(msgOne)); 

e.getChannel().write(tranStr2Buffer(msgTwo)); 

e.getChannel().write(tranStr2Buffer(msgThree)); 

} 

 

/** 

* 将字符串转换成{@link ChannelBuffer},私有方法不进行字符串的非空判断。 

* 

* @param str 

*            待转换字符串,要求非null 

* @return 转换后的ChannelBuffer 

* @author lihzh 

*/

private ChannelBuffer tranStr2Buffer(String str) { 

ChannelBuffer buffer = ChannelBuffers.buffer(str.length()); 

buffer.writeBytes(str.getBytes()); 

return buffer; 

} 

 

}

 

服务端输出结果:


Hello
, I'm
clie
nt.

这里其实,服务端是否分段发送并不会影响输出结果,也就是说,你一次性的把"Hi, I'm client."这段信息发送过来,输出的结果也是一样的。这就是开头说的,传输的是流,不分包。而只在于你如何分段读写。

分享到:
评论

相关推荐

    Java NIO框架Netty教程.pdf

    Java NIO框架Netty教程 很好的东西!

    Java_NIO框架Netty教程

    资源名称:Java_NIO框架Netty教程资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    Java_NIO框架Netty教程.pdf

    Java_NIO框架Netty教程.pdf

    Java NIO框架Netty简单使用的示例

    本篇文章主要介绍了Java NIO框架Netty简单使用的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java-NIO-Netty框架学习

    Java-NIO-Netty框架入门学习。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    NIO框架Netty实现高性能高并发

    Java异步NIO框架Netty实现高性能高并发无标题笔记 1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨 节点...

    NIO+Netty5视频教程与Netty源码剖析视频教程

    视频分两部分:第一部分:深入浅出Netty源码剖析;第二部分:NIO+Netty5各种RPC架构实战演练(非加密)

    JavaNIO chm帮助文档

    Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六) Selector Java NIO系列教程(七) FileChannel Java NIO系列教程(八) SocketChannel Java NIO系列教程...

    java网络编程 nio-netty

    java网络编程 nio-netty,想要学习netty的同学,这本书是非常好的资源。

    NIO框架netty

    本书详细的介绍了NIO框架netty的使用,并附有详细的使用案例,本书讲解通俗易懂,适合初学者快速入门。

    基于NIO的Netty框架实战-Netty.zip

    基于NIO的Netty框架实战-Netty

    NIO Netty框架

    NIO 框架 netty 与 mina

    Java视频教程 Java游戏服务器端开发 Netty NIO AIO Mina视频教程

    jaca视频教程 jaca游戏服务器端开发 Netty NIO AIO Mina视频教程 课程目录: 一、Netty快速入门教程 01、第一课NIO 02、第二课netty服务端 03、第三课netty客户端 04、第四课netty线程模型源码分析(一) 05、...

    java NIO 视频教程

    Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...

    深入Hotspot源码与Linux内核理解NIO与Netty线程模型.pdf

    深入Hotspot源码与Linux内核理解NIO与Netty线程模型

    高性能框架Netty.doc

    Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制...

    java NIO和java并发编程的书籍

    java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...

    Java NIO通信框架在电信领域的实践

    从广义上看电信软件的范围非常广,细分实际可以分为两大类:系统软件和业务应用软件。...本文重点介绍电信业务应用软件的技术变迁历史,以及华为电信软件架构演进和Java NIO框架在技术变迁中起到的关键作用。

Global site tag (gtag.js) - Google Analytics