`
jguangyou
  • 浏览: 375722 次
  • 性别: 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."这段信息发送过来,输出的结果也是一样的。这就是开头说的,传输的是流,不分包。而只在于你如何分段读写。

分享到:
评论

相关推荐

    netty 新NIO框架 文档

    ### Netty新NIO框架知识点概述 #### 一、Netty框架简介 Netty是一款高性能的网络应用开发框架,它采用事件驱动的方式处理网络通信,主要用于简化网络编程的复杂度,提升开发效率与系统性能。根据给定文档的描述部分...

    java nio 原理浅析

    Netty是基于Java NIO的一个高性能、异步事件驱动的网络应用程序框架,它简化了开发复杂的网络应用,比如TCP和UDP协议的应用。 Netty的整体结构复杂且灵活,它包含了多种组件,如Bootstrap、Channel、EventLoopGroup...

    netty-3.2.5终极手册

    Netty内部使用高效的缓冲数据结构(ChannelBuffer),支持快速的数据读写操作。 ##### 2. 统一的异步I/O API Netty提供了一个统一的异步I/O API,使得开发人员能够轻松地处理各种网络通信任务,无论是在NIO还是...

    Netty实现原理浅析

    Netty是一款由JBoss推出的高效且功能丰富的Java NIO框架,旨在简化网络编程并提高性能。为了更好地理解Netty的工作原理,我们首先需要了解它的整体架构。Netty的总体结构图清晰地展示了各个组成部分之间的关系及其...

    netty nio 技术文档

    ### Netty NIO技术文档知识点概述 #### 一、Netty与NIO的基本概念 - **Netty**:一个高性能的异步事件驱动框架,专为服务器端开发设计,简化了网络应用程序的开发过程。 - **NIO (New I/O)**:Java平台的一种新的...

    java网络框架对比报告.pdf

    本报告旨在对比分析两大主流Java网络框架——Apache Mina与JBoss Netty,从功能特性、使用便捷性、性能等方面进行深入探讨。 #### 二、Apache Mina网络通信应用框架 ##### 2.1 概述 Apache Mina是一个基于Java NIO...

    Netty实现原理浅析.pdf

    Netty是一个高性能的Java NIO框架,由JBoss出品。它不仅提供了一套完整的客户端和服务端开发工具集,而且具备高度可定制化的特点,使得开发者能够轻松构建出可靠且高效的应用程序。为了更好地理解Netty的工作机制,...

    Netty那点事(2)Netty中的bufferJava开

    在Java开发领域,Netty作为一个高性能、异步的网络通信框架,被广泛应用在高并发、低延迟的系统中。本文将深入探讨Netty中的Buffer组件,这是Netty处理网络数据的核心部分,对于理解和优化Java应用的性能至关重要。 ...

    Netty实现原理浅析.docx

    Netty 是一个由 JBoss 开发的高性能 Java NIO(非阻塞I/O)框架,为构建网络应用程序提供了丰富的功能和高效性能。Netty 的设计目标是简化网络编程的复杂性,提供高度优化且易于使用的API,使得开发者可以快速创建出...

    Netty_3.2_中文用户手册

    Netty 是一个基于 Java 的异步、事件驱动的网络应用程序框架,专为高性能、高扩展性和高可维护性的网络协议服务器和客户端设计。该手册由张立明翻译,Princy 进行了二次整理,对于学习和使用 Netty 框架的初学者,...

    netty源码阅读笔记.pdf

    2. **ChannelBuffer**:Netty中的ChannelBuffer是用于存储和传输数据的基本单元,类似于Java NIO中的ByteBuffer,但提供了更高级别的操作。它支持零拷贝,高效地处理网络I/O,并提供了一种线程安全的方式来读写数据...

    netty权威指南第二版源码

    1. **NIO(Non-blocking I/O)**:Netty 基于 Java NIO(非阻塞 I/O)库,使得它可以处理大量并发连接,尤其适合高负载的网络应用。 2. **Channel**:Channel 是 Netty 中的核心接口,它代表了网络连接,可以读取和...

    Netty+3.1中文用户手册

    - **使用 POJO 代替 ChannelBuffer**:介绍如何使用普通的 Java 对象(POJOs)替代 ChannelBuffer 进行数据交换,提高代码的可读性和可维护性。 - **关闭应用**:正确的关闭顺序对于资源释放至关重要,Netty 提供...

    Netty 3.1中文用户手册

    Netty 是一个专门为快速开发高性能、高可靠性网络应用而设计的 Java 框架。它提供了异步事件驱动的网络应用程序框架,使得开发者能够轻松创建网络服务器和客户端。Netty 3.1 中文用户手册提供了详细的指南,帮助...

    Netty 3.2 用户手册

    Netty是一款由Jboss开发的高效网络应用开发框架,它基于Java的NIO(New I/O)类库,提供了一个异步的、事件驱动的网络编程框架,用于快速开发高性能、高可靠性的网络服务器和客户端程序。Netty的主要特点包括异步性...

    Netty源码阅读笔记

    Netty是一款高性能的异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本篇阅读笔记主要围绕Netty的核心组件和原理进行详细分析。 首先,ChannelBuffer是Netty中用于网络数据交换的...

    Netty3.1中文用户手册.doc

    - **使用POJO代替ChannelBuffer**:展示如何直接使用Java对象与Netty交互,提高代码可读性。 - **关闭你的应用**:指导如何优雅地关闭Netty应用,释放资源。 通过学习Netty 3.1中文用户手册,开发者可以深入了解...

Global site tag (gtag.js) - Google Analytics