本文为原创,转载请注明出处
基于echo例子的netty4通信总结
在netty4源码分析系列文章中分别详细介绍了echo例子中涉及到网络通讯的每一个环节,本文对echo例子中服务端和客户端依次发生的步骤做个总结:
服务端依次发生的步骤
- 建立服务端监听套接字ServerSocketChannel,以及对应的管道pipeline;
- 启动boss线程,将ServerSocketChannel注册到boss线程持有的selector中,并将注册返回的selectionKey赋值给ServerSocketChannel关联的selectionKey变量;
- 在ServerSocketChannel对应的管道中触发channelRegistered事件;
- 绑定IP和端口
- 触发channelActive事件,并将ServerSocketChannel关联的selectionKey的OP_ACCEPT位置为1。
- 客户端发起connect请求后,boss线程正在运行的select循环检测到了该ServerSocketChannel的ACCEPT事件就绪,则通过accept系统调用建立一个已连接套接字SocketChannel,并为其创建对应的管道;
- 在服务端监听套接字对应的管道中触发channelRead事件;
- channelRead事件由ServerBootstrapAcceptor的channelRead方法响应:为已连接套接字对应的管道加入ChannelInitializer处理器;启动一个worker线程,并将已连接套接字的注册任务加入到worker线程的任务队列中;
- worker线程执行已连接套接字的注册任务:将已连接套接字注册到worker线程持有的selector中,并将注册返回的selectionKey赋值给已连接套接字关联的selectionKey变量;在已连接套接字对应的管道中触发channelRegistered事件;channelRegistered事件由ChannelInitializer的channelRegistered方法响应:将自定义的处理器(譬如EchoServerHandler)加入到已连接套接字对应的管道中;在已连接套接字对应的管道中触发channelActive事件;channelActive事件由已连接套接字对应的管道中的inbound处理器的channelActive方法响应;将已连接套接字关联的selectionKey的OP_READ位置为1;至此,worker线程关联的selector就开始监听已连接套接字的READ事件了。
- 在worker线程运行的同时,Boss线程接着在服务端监听套接字对应的管道中触发channelReadComplete事件。
- 客户端向服务端发送消息后,worker线程正在运行的selector循环会检测到已连接套接字的READ事件就绪。则通过read系统调用将消息从套接字的接受缓冲区中读到AdaptiveRecvByteBufAllocator(可以自适应调整分配的缓存的大小)分配的缓存中;
- 在已连接套接字对应的管道中触发channelRead事件;
- channelRead事件由EchoServerHandler处理器的channelRead方法响应:执行write操作将消息存储到ChannelOutboundBuffer中;
- 在已连接套接字对应的管道中触发ChannelReadComplete事件;
- ChannelReadComplete事件由EchoServerHandler处理器的channelReadComplete方法响应:执行flush操作将消息从ChannelOutboundBuffer中flush到套接字的发送缓冲区中;
客户端依次发生的步骤
- 建立套接字SocketChannel,以及对应的管道pipeline;
- 启动客户端线程,将SocketChannel注册到客户端线程持有的selector中,并将注册返回的selectionKey赋值给SocketChannel关联的selectionKey变量;
- 触发channelRegistered事件;
- channelRegistered事件由ChannelInitializer的channelRegistered方法响应:将客户端自定义的处理器(譬如EchoClientHandler)按顺序加入到管道中;
- 向服务端发起connect请求,并将SocketChannel关联的selectionKey的OP_CONNECT位置为1;
- 开始三次握手,客户端线程正在运行的select循环检测到了该SocketChannel的CONNECT事件就绪,则将关联的selectionKey的OP_CONNECT位置为0,再通过调用finishConnect完成连接的建立;
- 触发channelActive事件;
- channelActive事件由EchoClientHandler的channelActive方法响应,通过调用ctx.writeAndFlush方法将消息发往服务端;
- 首先将消息存储到ChannelOutboundBuffer中;(如果ChannelOutboundBuffer存储的所有未flush的消息的大小超过高水位线writeBufferHighWaterMark(默认值为64 * 1024),则会触发ChannelWritabilityChanged事件)
- 然后将消息从ChannelOutboundBuffer中flush到套接字的发送缓冲区中;(如果ChannelOutboundBuffer存储的所有未flush的消息的大小小于低水位线,则会触发ChannelWritabilityChanged事件)
相关推荐
Echo服务是网络编程中常见的例子,主要用于测试网络连接和数据传输。在Netty中,echo服务通过创建一个ServerBootstrap实例,配置并启动一个Acceptor(监听器)来监听指定端口的连接请求。当客户端连接到服务器时,...
这些例子是基于Netty 4版本,已经整理为可直接运行的Maven工程,便于开发者在本地进行实践和学习。 首先,我们要了解Netty的基本概念。Netty的核心是它的`Channel`和`EventLoop`。`Channel`是网络连接的抽象,可以...
1. NIO基础:Netty基于Java NIO来实现非阻塞的网络通信,因此需要对Java NIO有一定的了解。 2. 事件处理:Netty采用事件驱动机制来处理各种网络事件,理解其事件处理模型是掌握Netty的关键。 3. ChannelPipeline:...
1. **Echo Server**:这是最基础的例子,服务器接收客户端发送的数据并回显,展示了基本的Channel和Pipeline使用。 2. **Time Server**:服务器向客户端发送当前时间,演示了如何处理不同类型的Message。 3. **...
这个压缩包文件"java Netty 框架例子源码.rar"很可能包含了一系列示例代码,帮助我们了解和学习如何在实际项目中使用 Netty。 Netty 的核心组件包括: 1. **Channel**:是 Netty 中的基本概念,代表一个打开的连接...
《Netty 4.x 用户指南》是一份专为初学者准备的网络通信技术教程,它详细介绍了Netty框架的使用方法和核心概念。Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端...
在本篇关于“Netty框架学习——第一个Netty应用”的文章中,我们将深入理解如何使用Netty构建一个简单的Echo服务器和客户端。Netty是一个高性能、异步事件驱动的网络应用程序框架,广泛应用于Java领域的服务器开发。...
书中通过一个简单的echo服务器和客户端的例子,向开发者展示了如何编写、编译和运行一个Netty应用。这个例子覆盖了Netty应用的基本结构,包括Channel(通道)、EventLoop(事件循环)、以及I/O操作。 Netty中的...
总结起来,Netty 的长连接和自动重连机制是通过 Channel 和 ChannelHandler 实现的。在设计网络应用时,理解并利用这些特性可以提高系统的稳定性和可靠性。同时,通过自定义 ChannelHandler,我们可以灵活地处理异常...
- **WebSocket程序示例**:通过具体的例子展示如何使用Netty实现WebSocket服务器和客户端。 - **添加WebSocket支持**:介绍如何在现有的Netty应用中添加WebSocket的支持。 - **测试程序**:提供测试WebSocket功能的...
首先,Netty 的核心设计理念是基于 Channel 和 EventLoop。Channel 是 Netty 中处理 I/O 操作的基本单元,它可以是 TCP 连接、UDP 数据报或者文件描述符等。EventLoop 是 Netty 的事件循环,负责监听和处理 Channel ...
Netty是一款由Jboss开发的高效网络应用开发框架,它基于Java的NIO(New I/O)类库,提供了一个异步...通过阅读手册并实践其中的例子,开发者可以快速掌握Netty框架,进而在项目中实现高性能、高可靠性的网络通信功能。
在Java领域,Netty因其高效性、灵活性和丰富的特性集而被广泛使用,尤其是在开发网络通信应用时。 标题"Java Netty客户端与服务器"表明我们将探讨如何使用Netty构建一个简单的服务器和客户端系统,其中客户端能够...
Echo 示例是Netty中最基础的例子,演示了如何创建一个简单的回显服务器。服务器接收客户端发送的数据,并原样返回。这个例子可以帮助理解Netty的ByteBuf数据传输机制以及ChannelHandler的工作原理。 3. **Protocol...
标题“Essential Netty In Action”表明本文是一...综上所述,本书通过具体例子和理论知识的结合,深入浅出地介绍Netty框架的核心概念和高级特性,非常适合Java网络编程初学者以及希望进一步深化对Netty理解的开发者。
这个“TestNetty 一个小例子”显然旨在帮助我们理解如何在实际项目中使用 Netty 进行通信。 Netty 的核心组件包括: 1. **Channel**:它是 Netty 中的基本数据通道,通过它进行网络数据的读写操作。 2. **EventLoop...
"weisong-echo-proxy"是一个基于Java的网络编程项目,主要使用了Netty框架来实现一个简单的回声代理。这个代理服务器的主要功能是接收客户端的请求,并将这些请求原封不动地转发到目标服务器,然后再将目标服务器的...
4. **TCP 和 UDP 示例**:Netty 支持基于 TCP 和 UDP 的通信,这些示例将展示如何创建服务器和客户端。 5. **编解码器示例**:在 Netty 中,自定义编解码器是常见的需求,用于将原始字节流转换为业务对象,或者反之...
5. 在这个例子中,"Echo"意味着服务器将接收到的数据原封不动地回送给客户端,因此服务器端需要读取输入流,然后写入到输出流。 在`EchoClient.java`中,客户端的主要任务包括: 1. 创建Socket对象,指定服务器的IP...
此外,考虑到跨平台通信,源码可能还涉及到Java的MINA2或Netty4框架,它们在服务端实现了UDP通信功能。MINA2是一个异步网络通信框架,适合构建高性能的服务;Netty4则是一个更现代、功能更全面的网络应用框架,同样...