前2篇分析了echo server端的运行机制,本篇同样以echo client为例,分析netty的nio客户端的运行机制。
总体来说client端和server端的处理是类似的,NioWorker是重用的,也就意味着client和server的读写机制是一样的,都是通过worker线程来管理的。所不同的是Boss线程,server端的boss线程一个bind端口起一个,主要负责接收新请求,而client端的boss线程是一个可配置的数组,一个connect端口分配一个,主要负责connect过程,如果connect成功则将channle注册到worker线程中处理。在Client同样有PipelineSink,叫做NioClientSocketPipelineSink,也是负责底层IO和pipeline之间的交互。
EchoClient代码:
Java代码
  1. // 初始化Bootstrap和NioClientSocketChannelFactory,这一步将启动nioWorker线程,并初始化NioClientSocketPipelineSink,并将Boss线程创建
  2. ClientBootstrap bootstrap = new ClientBootstrap(
  3. new NioClientSocketChannelFactory(
  4. Executors.newCachedThreadPool(),
  5. Executors.newCachedThreadPool()));
  6. // 用户自定义的pipeline工厂
  7. bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
  8. public ChannelPipeline getPipeline() throws Exception {
  9. return Channels.pipeline(
  10. new EchoClientHandler(firstMessageSize));
  11. }
  12. });
  13. // 异步创建连接
  14. ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));
  15. //等待连接关闭
  16. future.getChannel().getCloseFuture().awaitUninterruptibly();
  17. // 关闭资源,线程池等
  18. bootstrap.releaseExternalResources();
        // 初始化Bootstrap和NioClientSocketChannelFactory,这一步将启动nioWorker线程,并初始化NioClientSocketPipelineSink,并将Boss线程创建ClientBootstrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newCachedThreadPool()));// 用户自定义的pipeline工厂bootstrap.setPipelineFactory(new ChannelPipelineFactory() {public ChannelPipeline getPipeline() throws Exception {return Channels.pipeline(new EchoClientHandler(firstMessageSize));}});// 异步创建连接ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));//等待连接关闭future.getChannel().getCloseFuture().awaitUninterruptibly();// 关闭资源,线程池等bootstrap.releaseExternalResources();
具体connect过程:
一.创建client的channel
Java代码
  1. public ChannelFuture connect(final SocketAddress remoteAddress, final SocketAddress localAddress) {
  2. ......
  3. //拿用户自定义的pipeline
  4. ChannelPipeline pipeline;
  5. try {
  6. pipeline = getPipelineFactory().getPipeline();
  7. } catch (Exception e) {
  8. throw new ChannelPipelineException("Failed to initialize a pipeline.", e);
  9. }
  10. // 从ChannelFactory中,创建Channel,对于client来说factory是NioClientSocketChannelFactory,Channel是NioClientSocketChannel
  11. Channel ch = getFactory().newChannel(pipeline);
  12. // 通过channel连接
  13. return ch.connect(remoteAddress);
  14. }
public ChannelFuture connect(final SocketAddress remoteAddress, final SocketAddress localAddress) {......//拿用户自定义的pipelineChannelPipeline pipeline;try {pipeline = getPipelineFactory().getPipeline();} catch (Exception e) {throw new ChannelPipelineException("Failed to initialize a pipeline.", e);}// 从ChannelFactory中,创建Channel,对于client来说factory是NioClientSocketChannelFactory,Channel是NioClientSocketChannelChannel ch = getFactory().newChannel(pipeline);// 通过channel连接return ch.connect(remoteAddress);}
二.创建channel时,分配worker
Java代码
  1. public SocketChannel newChannel(ChannelPipeline pipeline) {
  2. return new NioClientSocketChannel(this, pipeline, sink, sink.nextWorker());
  3. }
 public SocketChannel newChannel(ChannelPipeline pipeline) {return new NioClientSocketChannel(this, pipeline, sink, sink.nextWorker());}
三.创建内部的SocketChannel,触发ChannelOpen事件,不过echo client的handler没有对channelOpen事件做处理

转载于:https://blog.51cto.com/daheyuan/1140093

深入浅出Netty之四 Client请求处理相关推荐

  1. gateway网关调用报 reactor.netty.http.client.HttpClient.chunkedTransfer(Z)Lreactor/netty/http/client/HttpC

    reactor.netty.http.client.HttpClient.chunkedTransfer(Z)Lreactor/netty/http/client/HttpClient; 这个错误是因 ...

  2. 【问题归纳】开启gateway网关调用报错: reactor.netty.http.client.HttpClient.chunkedTransfer(Z)L

    开启 gateway 网关报错reactor.netty.http.client.HttpClient.chunkedTransfer(Z)Lreactor/netty/http/client/Htt ...

  3. Connection prematurely closed BEFORE response reactor.netty.http.client.PrematureCloseException: Co

    一.最近在开发网关系统,就在感觉万事大吉可以上线的时候发现了如下的错误(这个是我在配置rabbitmq访问多个服务时发现的) Connection prematurely closed BEFORE ...

  4. Netty入门教程——深入浅出Netty

    在这里我们主要从TCP应用部分讲述 Netty 的架构体系. 它涉及到的内容主要分为三个部分 : bootstrap, channel, eventLoop. bootstrap 主要负责服务建立与发 ...

  5. 4、netty编写http服务器、增加压缩支持、netty编写client、netty添加SL/TLS保护https支持

    注:源代码来自享学课堂,学习之后所做笔记,方便回顾,也给大家一个参考 目录 1 netty编写http服务器 1.1 主函数 1.2 ServerHandlerInit 1.3 服务端自定义BusiH ...

  6. Netty之四种常用 IO 模型

    四种常用 IO 模型: 同步阻塞 BIO: 最简单的 IO 模型,用户线程在读写时被阻塞. 数据拷贝指请求到的数据先存放在内核空间, 然后从内核空间拷贝至程序的缓冲区. 用户线程在 IO 过程中被阻塞 ...

  7. 一篇文章让你彻底了解什么叫Netty!大牛看了直呼内行!

    作者:java蜜蜜 链接:https://www.jianshu.com/p/1369b30b9f99 一.Netty到底是什么 1.从HTTP说起 有了Netty,你可以实现自己的HTTP服务器,F ...

  8. netty websocket客户端_Websocket操作字节序 之 服务端

    Websocket在JavaScript中操作字节序 之 客户端 在上一篇文章中,把页面的websocket编码写好了,那么服务端又该如何实现呢?由于该文是在上上篇demo中修改的,所以不全的代码还请 ...

  9. netty半包粘包 处理_老王:Netty到底是个什么鬼?有没有简单的理解方式?

    前语:不要为了读文章而读文章,一定要带着问题来读文章,勤思考. 作者:lyowish    来源:http://1t.click/7RY # 从HTTP说起 有了Netty,你可以实现自己的HTTP服 ...

最新文章

  1. 程序员创业前要做哪些准备?
  2. 顶点(vertexs) 图元(primitives) 片元(fragments片断) 像素(pixels)
  3. 物联网助推超市转型之具体应用分析
  4. php双向通信,RSA + AES 双向通信加密
  5. 20172303 2017-2018-2 《程序设计与数据结构》第4周学习总结
  6. B. 重载技术(overloading)
  7. 自定义控件--实现步骤
  8. Nodejs之http模块详解
  9. JSON语法之JSON键/值对
  10. Unity 碰撞器和触发器的理解
  11. 团队-爬虫豆瓣top250项目-模块开发过程
  12. ipconfig默认网关为空_网络工程师之IPCONFIG命令详解
  13. 空卡安装设置树莓派4B并安装opencv+QT
  14. Race Condition是什么
  15. vue中怎么点击修改文字_怎么拍照识别文字?什么软件可以识别照片中文字?
  16. 网际风全推数据接口_网际风数据接口飞狐交易师版简要说明.doc
  17. 轻松记录南极最美丽风景 有TA就已经足够
  18. iOS 答题功能实现
  19. 兰燕-杨平平的需求建议
  20. Mac中Android Studio使用内存调整方法

热门文章

  1. java文件没反应_Java实现文件点击没反应的方法
  2. 计算机科学与技术分享会,“相伴成长,绘梦未来”——计算机科学学院计算机科学与技术专业举办交流分享会...
  3. 网络库urillib3
  4. 【存储知识学习】第八章-Fibre Channel协议《大话存储》阅读笔记
  5. 信息系统项目管理师需要准备多久?备考技巧分享
  6. web.xml配置详细
  7. Leaflet中使用leaflet.easyPrint插件实现打印效果
  8. VSCode来绘制流程图真是得心应手
  9. Cordova创建你的第一个App
  10. 在Flutter中设置更好的Logging的指南