一、客户端开发时序图

  

  图片来源:Netty权威指南(第2版)

二、Netty客户端开发步骤

  使用Netty进行客户端开发主要有以下几个步骤:

  1、用户线程创建Bootstrap

  1. Bootstrap b = new Bootstrap();

  Bootstrap是Socket客户端创建工具类,通过API设置创建客户端相关的参数,异步发起客户端连接。

  2、创建处理客户端连接、IO读写的Reactor线程组NioEventLoopGroup

  1. EventLoopGroup group = new NioEventLoopGroup();

  3、通过Bootstrap的ChannelFactory和用户指定的Channel类型创建用于客户端连接的NioSocketChannel

  1. b.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true)

  此处的NioSocketChannel类似于Java NIO提供的SocketChannel。

  4、创建默认的channel Handler pipeline

  1. b.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true)
  2. .handler(new ChannelInitializer<SocketChannel>()
  3. {
  4. @Override
  5. public void initChannel(SocketChannel ch) throws Exception
  6. {
  7. ch.pipeline().addLast(new HelloClientHandler());
  8. }
  9. });

  用于调度和执行网络事件。

  5、异步发起TCP连接

  1. // 发起异步连接操作
  2. ChannelFuture f = b.connect(host, port).sync();

  SocketChannel执行connect()操作后有以下三种结果:

  • 连接成功,然会true;
  • 暂时没有连接上,服务器端没有返回ACK应答,连接结果不确定,返回false。此种结果下,需要将NioSocketChannel中的selectionKey设置为OP_CONNECT,监听连接结果;
  • 接连失败,直接抛出I/O异常

  6、由多路复用器在I/O中轮询个Channel,处理连接结果

  7、如果连接成功,设置Future结果,发送连接成功事件,触发ChannelPipeline执行

  8、由ChannelPipeline调度执行系统和用户的ChannelHandler,执行业务逻辑

三、Netty客户端开发示例代码

  需求:客户端端实现,连接服务器端,并向服务器端发送hello Netty。(注:本代码使用的netty是netty-all-5.0.0.Alpha1-sources.jar版本)

  服务器端代码见Netty学习之服务器端创建

  客户端代码:

  1. import io.netty.bootstrap.Bootstrap;
  2. import io.netty.channel.ChannelFuture;
  3. import io.netty.channel.ChannelInitializer;
  4. import io.netty.channel.ChannelOption;
  5. import io.netty.channel.EventLoopGroup;
  6. import io.netty.channel.nio.NioEventLoopGroup;
  7. import io.netty.channel.socket.SocketChannel;
  8. import io.netty.channel.socket.nio.NioSocketChannel;
  9.  
  10. public class HelloClient
  11. {
  12. public void connect(int port, String host) throws Exception
  13. {
  14. // 配置客户端NIO线程组
  15. EventLoopGroup group = new NioEventLoopGroup();
  16. try
  17. {
  18. Bootstrap b = new Bootstrap();
  19. b.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true)
  20. .handler(new ChannelInitializer<SocketChannel>()
  21. {
  22. @Override
  23. public void initChannel(SocketChannel ch) throws Exception
  24. {
  25. ch.pipeline().addLast(new HelloClientHandler());
  26. }
  27. });
  28.  
  29. // 发起异步连接操作
  30. ChannelFuture f = b.connect(host, port).sync();
  31.  
  32. // 等待客户端链路关闭
  33. f.channel().closeFuture().sync();
  34. } finally
  35. {
  36. group.shutdownGracefully();
  37. }
  38. }
  39. public static void main(String[] args) throws Exception
  40. {
  41. int port = 8080;
  42. new HelloClient().connect(port, "127.0.0.1");
  43. }
  44. }
  1. import io.netty.buffer.ByteBuf;
  2. import io.netty.buffer.Unpooled;
  3. import io.netty.channel.ChannelHandlerAdapter;
  4. import io.netty.channel.ChannelHandlerContext;
  5.  
  6. public class HelloClientHandler extends ChannelHandlerAdapter
  7. {
  8.  
  9. private final ByteBuf message;
  10.  
  11. public HelloClientHandler()
  12. {
  13. byte[] req="hello Netty".getBytes();
  14. message=Unpooled.buffer(req.length);
  15. message.writeBytes(req);
  16. }
  17.  
  18. @Override
  19. public void channelActive(ChannelHandlerContext ctx) throws Exception
  20. {
  21. ctx.writeAndFlush(message);
  22. }
  23.  
  24. @Override
  25. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception
  26. {
  27. ctx.close();
  28. }
  29. }

  程序运行结果:

  

四、参考资料

  1、Netty权威指南

Netty学习之客户端创建的更多相关文章

  1. Netty学习之服务器端创建

    一.服务器端开发时序图 图片来源:Netty权威指南(第2版) 二.Netty服务器端开发步骤 使用Netty进行服务器端开发主要有以下几个步骤: 1.创建ServerBootstrap实例 Serv ...

  2. Netty学习笔记(二) 实现服务端和客户端

    在Netty学习笔记(一) 实现DISCARD服务中,我们使用Netty和Python实现了简单的丢弃DISCARD服务,这篇,我们使用Netty实现服务端和客户端交互的需求. 前置工作 开发环境 J ...

  3. Netty 学习(一):服务端启动 & 客户端启动

    Netty 学习(一):服务端启动 & 客户端启动 作者: Grey 原文地址: 博客园:Netty 学习(一):服务端启动 & 客户端启动 CSDN:Netty 学习(一):服务端启 ...

  4. Netty 学习(二):服务端与客户端通信

    Netty 学习(二):服务端与客户端通信 作者: Grey 原文地址: 博客园:Netty 学习(二):服务端与客户端通信 CSDN:Netty 学习(二):服务端与客户端通信 说明 Netty 中 ...

  5. Netty(6)源码-服务端与客户端创建

    原生的NIO类图使用有诸多不便,Netty向用户屏蔽了细节,在与用户交界处做了封装. 一.服务端创建时序图 步骤一:创建ServerBootstrap实例 ServerBootstrap是Netty服 ...

  6. Netty学习——基于netty实现简单的客户端聊天小程序

    Netty学习——基于netty实现简单的客户端聊天小程序 效果图,聊天程序展示 (TCP编程实现) 后端代码: package com.dawa.netty.chatexample; import ...

  7. Netty 学习(六):创建 NioEventLoopGroup 的核心源码说明

    Netty 学习(六):创建 NioEventLoopGroup 的核心源码说明 作者: Grey 原文地址: 博客园:Netty 学习(六):创建 NioEventLoopGroup 的核心源码说明 ...

  8. Netty 学习(七):NioEventLoop 对应线程的创建和启动源码说明

    Netty 学习(七):NioEventLoop 对应线程的创建和启动源码说明 作者: Grey 原文地址: 博客园:Netty 学习(七):NioEventLoop 对应线程的创建和启动源码说明 C ...

  9. Netty 学习 一、初识Netty【原创】

    在过去几年的工作和学习中,比较关注高层次的应用开发,对底层探究较少.实现Web应用的开发,主要依赖Tomcat.Apache等应用服务器,程序员无需了解底层协议,但同样限制了应用的性能和效率.现在开始 ...

随机推荐

  1. Centos单网卡配置多个IP的方法

    网上好多介绍一个网卡多个IP的方法,都有些问题,下面是实践可行的方法 DEVICE="eth0" TYPE="Ethernet" BOOTPROTO=none ...

  2. Linux文件和windows文件在 换行符的区别

    Linux或Unix文件,和windows文件,在来回处理时,如果不注意 换行符的区别,可能导致程序错误!!!深刻的教训.... 在早期的打印机时代,开始新的一行要占用两个字符的时间.如果到了一行的结 ...

  3. 太阳升起并下落的小动画-SWIFT

    一个小小的动画,太阳公公上山又下山.先上效果图. 用 lipecap 录的gif效果有点卡顿.好吧,说下如何实现的. 首先在一个大圆内先计算出内切九边形各个顶点的位置,接着连接相应的顶点变成一个九角星 ...

  4. iOS杂谈-图片拉伸的实现

    如上图是一个按钮的背景图,在Android上,很多图片资源都是类似这样子的,但是由于按钮的高度及宽度与图片的世纪尺寸不同,所以需要采用9patch来实现拉伸处理, 可参考:http://www.cnb ...

  5. 关于创建可执行的jar文件(assembly)

    java利用maven生成一个jar包,如何自动生成清单属性文件(MANIFEST.MF),如何解决jar依赖问题? 办法很简单: 只需在pom.xml文件中配置如下plugin即可: <plu ...

  6. c#如何区分静态只读变量和常量

    常量const 常量就是一个其值永远不会改变的静态字段.常量的值会在编译时自动推算,编译器会在遇到常量时,将其逐个替换为该常量的值.常量可以是C#内建的任何数字类型或枚举类型.声明一个常量的时候必须对 ...

  7. javascript不用new关键字创建对象示例

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 关于mvc、webapi中get、post、put、delete的参数

    webapi中post提交的数据必须是一个类,get提交的数量无所谓 多种参数get时,参数名不能相同: 在能通过c#的校验的前提下,参数名.参数数量不能全完相同 public string Get( ...

  9. VS2012文本编辑器鼠标不能滚动

  10. songtaste网站歌曲真实URL获取

    个人挺喜欢songtaste网站的歌曲的,下载方法也层出不穷,可是作为程序员如果不知其中原理的方法真是羞愧.首先简单点的方法当然有google插件这样的嗅探器了,不过这种工具的原理还不是很了解.今天先 ...