`
海浪儿
  • 浏览: 274221 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

基于echo例子的netty4通信总结

阅读更多

本文为原创,转载请注明出处

基于echo例子的netty4通信总结

 

netty4源码分析系列文章中分别详细介绍了echo例子中涉及到网络通讯的每一个环节,本文对echo例子中服务端和客户端依次发生的步骤做个总结:

 

服务端依次发生的步骤

  1. 建立服务端监听套接字ServerSocketChannel,以及对应的管道pipeline
  2. 启动boss线程,将ServerSocketChannel注册到boss线程持有的selector中,并将注册返回的selectionKey赋值给ServerSocketChannel关联的selectionKey变量;
  3. ServerSocketChannel对应的管道中触发channelRegistered事件;
  4. 绑定IP和端口
  5. 触发channelActive事件,并将ServerSocketChannel关联的selectionKeyOP_ACCEPT位置为1
  6. 客户端发起connect请求后,boss线程正在运行的select循环检测到了该ServerSocketChannelACCEPT事件就绪,则通过accept系统调用建立一个已连接套接字SocketChannel,并为其创建对应的管道;
  7. 在服务端监听套接字对应的管道中触发channelRead事件;
  8. channelRead事件由ServerBootstrapAcceptorchannelRead方法响应:为已连接套接字对应的管道加入ChannelInitializer处理器;启动一个worker线程,并将已连接套接字的注册任务加入到worker线程的任务队列中;
  9. worker线程执行已连接套接字的注册任务:将已连接套接字注册到worker线程持有的selector中,并将注册返回的selectionKey赋值给已连接套接字关联的selectionKey变量;已连接套接字对应的管道中触发channelRegistered事件;channelRegistered事件由ChannelInitializerchannelRegistered方法响应:将自定义的处理器(譬如EchoServerHandler)加入到已连接套接字对应的管道中;已连接套接字对应的管道中触发channelActive事件;channelActive事件由已连接套接字对应的管道中的inbound处理器的channelActive方法响应;已连接套接字关联的selectionKeyOP_READ位置为1;至此,worker线程关联的selector就开始监听已连接套接字的READ事件了。
  10. worker线程运行的同时,Boss线程接着在服务端监听套接字对应的管道中触发channelReadComplete事件。
  11. 客户端向服务端发送消息后,worker线程正在运行的selector循环会检测到已连接套接字的READ事件就绪。则通过read系统调用将消息从套接字的接受缓冲区中读到AdaptiveRecvByteBufAllocator(可以自适应调整分配的缓存的大小)分配的缓存中;
  12. 在已连接套接字对应的管道中触发channelRead事件;
  13. channelRead事件由EchoServerHandler处理器的channelRead方法响应:执行write操作将消息存储到ChannelOutboundBuffer中;
  14. 在已连接套接字对应的管道中触发ChannelReadComplete事件
  15. ChannelReadComplete事件EchoServerHandler处理器的channelReadComplete方法响应:执行flush操作将消息从ChannelOutboundBufferflush到套接字的发送缓冲区中;

 

客户端依次发生的步骤

  1. 建立套接字SocketChannel,以及对应的管道pipeline
  2. 启动客户端线程,SocketChannel注册到客户端线程持有的selector中,并将注册返回的selectionKey赋值给SocketChannel关联的selectionKey变量;
  3. 触发channelRegistered事件;
  4. channelRegistered事件由ChannelInitializerchannelRegistered方法响应:将客户端自定义的处理器(譬如EchoClientHandler)按顺序加入到管道中;
  5. 向服务端发起connect请求,并将SocketChannel关联的selectionKeyOP_CONNECT位置为1
  6. 开始三次握手,客户端线程正在运行的select循环检测到了该SocketChannelCONNECT事件就绪,则将关联的selectionKeyOP_CONNECT位置为0,再通过调用finishConnect完成连接的建立;
  7. 触发channelActive事件;
  8. channelActive事件由EchoClientHandlerchannelActive方法响应,通过调用ctx.writeAndFlush方法将消息发往服务端;
  9. 首先将消息存储到ChannelOutboundBuffer中;(如果ChannelOutboundBuffer存储的所有未flush的消息的大小超过高水位线writeBufferHighWaterMark(默认值为64 * 1024,则会触发ChannelWritabilityChanged事件)
  10. 然后将消息从ChannelOutboundBufferflush到套接字的发送缓冲区中;(如果ChannelOutboundBuffer存储的所有未flush的消息的大小小于低水位线,则会触发ChannelWritabilityChanged事件)
分享到:
评论

相关推荐

    《Netty实战》中的 echo 代码-netty-echo.zip

    Echo服务是网络编程中常见的例子,主要用于测试网络连接和数据传输。在Netty中,echo服务通过创建一个ServerBootstrap实例,配置并启动一个Acceptor(监听器)来监听指定端口的连接请求。当客户端连接到服务器时,...

    netty官方例子

    这些例子是基于Netty 4版本,已经整理为可直接运行的Maven工程,便于开发者在本地进行实践和学习。 首先,我们要了解Netty的基本概念。Netty的核心是它的`Channel`和`EventLoop`。`Channel`是网络连接的抽象,可以...

    Netty3.x 源码解析

    1. NIO基础:Netty基于Java NIO来实现非阻塞的网络通信,因此需要对Java NIO有一定的了解。 2. 事件处理:Netty采用事件驱动机制来处理各种网络事件,理解其事件处理模型是掌握Netty的关键。 3. ChannelPipeline:...

    netty5.0 jar包 官方例子_改 中文手册

    1. **Echo Server**:这是最基础的例子,服务器接收客户端发送的数据并回显,展示了基本的Channel和Pipeline使用。 2. **Time Server**:服务器向客户端发送当前时间,演示了如何处理不同类型的Message。 3. **...

    java Netty 框架例子源码.rar

    这个压缩包文件"java Netty 框架例子源码.rar"很可能包含了一系列示例代码,帮助我们了解和学习如何在实际项目中使用 Netty。 Netty 的核心组件包括: 1. **Channel**:是 Netty 中的基本概念,代表一个打开的连接...

    netty4用户指南

    《Netty 4.x 用户指南》是一份专为初学者准备的网络通信技术教程,它详细介绍了Netty框架的使用方法和核心概念。Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端...

    Netty 框架学习 —— 第一个 Netty 应用(csdn)————程序.pdf

    在本篇关于“Netty框架学习——第一个Netty应用”的文章中,我们将深入理解如何使用Netty构建一个简单的Echo服务器和客户端。Netty是一个高性能、异步事件驱动的网络应用程序框架,广泛应用于Java领域的服务器开发。...

    essential-netty-in-action.pdf

    书中通过一个简单的echo服务器和客户端的例子,向开发者展示了如何编写、编译和运行一个Netty应用。这个例子覆盖了Netty应用的基本结构,包括Channel(通道)、EventLoop(事件循环)、以及I/O操作。 Netty中的...

    netty5长连接.自动重连

    总结起来,Netty 的长连接和自动重连机制是通过 Channel 和 ChannelHandler 实现的。在设计网络应用时,理解并利用这些特性可以提高系统的稳定性和可靠性。同时,通过自定义 ChannelHandler,我们可以灵活地处理异常...

    netty-in-action中文版

    - **WebSocket程序示例**:通过具体的例子展示如何使用Netty实现WebSocket服务器和客户端。 - **添加WebSocket支持**:介绍如何在现有的Netty应用中添加WebSocket的支持。 - **测试程序**:提供测试WebSocket功能的...

    java-netty:netty框架例子代码

    首先,Netty 的核心设计理念是基于 Channel 和 EventLoop。Channel 是 Netty 中处理 I/O 操作的基本单元,它可以是 TCP 连接、UDP 数据报或者文件描述符等。EventLoop 是 Netty 的事件循环,负责监听和处理 Channel ...

    Netty 3.2 用户手册

    Netty是一款由Jboss开发的高效网络应用开发框架,它基于Java的NIO(New I/O)类库,提供了一个异步...通过阅读手册并实践其中的例子,开发者可以快速掌握Netty框架,进而在项目中实现高性能、高可靠性的网络通信功能。

    JavaNetty客户端与服务器

    在Java领域,Netty因其高效性、灵活性和丰富的特性集而被广泛使用,尤其是在开发网络通信应用时。 标题"Java Netty客户端与服务器"表明我们将探讨如何使用Netty构建一个简单的服务器和客户端系统,其中客户端能够...

    netty-demos.zip

    Echo 示例是Netty中最基础的例子,演示了如何创建一个简单的回显服务器。服务器接收客户端发送的数据,并原样返回。这个例子可以帮助理解Netty的ByteBuf数据传输机制以及ChannelHandler的工作原理。 3. **Protocol...

    Essential Netty In Action

    标题“Essential Netty In Action”表明本文是一...综上所述,本书通过具体例子和理论知识的结合,深入浅出地介绍Netty框架的核心概念和高级特性,非常适合Java网络编程初学者以及希望进一步深化对Netty理解的开发者。

    TestNetty 一个小例子

    这个“TestNetty 一个小例子”显然旨在帮助我们理解如何在实际项目中使用 Netty 进行通信。 Netty 的核心组件包括: 1. **Channel**:它是 Netty 中的基本数据通道,通过它进行网络数据的读写操作。 2. **EventLoop...

    weisong-echo-proxy:使用 netty 的简单回声代理

    "weisong-echo-proxy"是一个基于Java的网络编程项目,主要使用了Netty框架来实现一个简单的回声代理。这个代理服务器的主要功能是接收客户端的请求,并将这些请求原封不动地转发到目标服务器,然后再将目标服务器的...

    netty-demo:学习netty时的例子, 各种demo

    4. **TCP 和 UDP 示例**:Netty 支持基于 TCP 和 UDP 的通信,这些示例将展示如何创建服务器和客户端。 5. **编解码器示例**:在 Netty 中,自定义编解码器是常见的需求,用于将原始字节流转换为业务对象,或者反之...

    java 进程之间的网络通信

    5. 在这个例子中,"Echo"意味着服务器将接收到的数据原封不动地回送给客户端,因此服务器端需要读取输入流,然后写入到输出流。 在`EchoClient.java`中,客户端的主要任务包括: 1. 创建Socket对象,指定服务器的IP...

    一款iOS平台UDP双向通信源码

    此外,考虑到跨平台通信,源码可能还涉及到Java的MINA2或Netty4框架,它们在服务端实现了UDP通信功能。MINA2是一个异步网络通信框架,适合构建高性能的服务;Netty4则是一个更现代、功能更全面的网络应用框架,同样...

Global site tag (gtag.js) - Google Analytics