阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Netty基础教程之客户端创建

198次阅读
没有评论

共计 3316 个字符,预计需要花费 9 分钟才能阅读完成。

阅读目录

  • 一、客户端开发时序图
  • 二、Netty 客户端开发步骤
  • 三、Netty 客户端开发示例代码
  • 四、参考资料

一、客户端开发时序图

Netty 基础教程之客户端创建

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

二、Netty 客户端开发步骤

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

1、用户线程创建 Bootstrap

Bootstrap b = new Bootstrap();

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

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

EventLoopGroup group = new NioEventLoopGroup();

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

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

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

4、创建默认的 channel Handler pipeline

b.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true)
 .handler(new ChannelInitializer<SocketChannel>()
  {
       @Override
       public void initChannel(SocketChannel ch) throws Exception
       {ch.pipeline().addLast(new HelloClientHandler());
        }
  });

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

5、异步发起 TCP 连接

// 发起异步连接操作 
 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 学习之服务器端创建

客户端代码:

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;

public class HelloClient
{public void connect(int port, String host) throws Exception
    {// 配置客户端 NIO 线程组 
        EventLoopGroup group = new NioEventLoopGroup();
        try
        {Bootstrap b = new Bootstrap();
            b.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true)
                    .handler(new ChannelInitializer<SocketChannel>()
                    {
                        @Override
                        public void initChannel(SocketChannel ch) throws Exception
                        {ch.pipeline().addLast(new HelloClientHandler());
                        }
                    });

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

            // 等待客户端链路关闭 
            f.channel().closeFuture().sync();} finally
        {group.shutdownGracefully();
        }
    }
    public static void main(String[] args) throws Exception
    {int port = 8080;
        new HelloClient().connect(port, "127.0.0.1");
    }
}
 
 
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;

public class HelloClientHandler  extends ChannelHandlerAdapter
{private final ByteBuf message;
    
    public HelloClientHandler()
    {byte[] req="hello Netty".getBytes();
        message=Unpooled.buffer(req.length);
        message.writeBytes(req);
    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception
    {ctx.writeAndFlush(message);
    }
    
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception
    {ctx.close();
    }
}

程序运行结果:

Netty 基础教程之客户端创建

四、参考资料

1、Netty 权威指南 (李林峰)【Netty 权威指南 PDF 完整版带目录书签 + 源码 下载地址 http://www.linuxidc.com/Linux/2016-07/133575.htm】

运用 Spring 注解实现 Netty 服务器端 UDP 应用程序  http://www.linuxidc.com/Linux/2013-09/89780.htm

Netty 源码学习笔记 http://www.linuxidc.com/Linux/2013-09/89778.htm

Netty 使用实例 http://www.linuxidc.com/Linux/2013-09/89779.htm

Java NIO 框架 –Netty4 的简单示例  http://www.linuxidc.com/Linux/2015-01/111335.htm

Netty 的详细介绍 :请点这里
Netty 的下载地址 :请点这里

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-07/133585.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计3316字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中