你好,游客 登录 注册 搜索
背景:
阅读新闻

Netty基础教程之客户端创建

[日期:2016-07-27] 来源:Linux社区  作者:xujian2014 [字体: ]

阅读目录

  • 一、客户端开发时序图
  • 二、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();
    }
}

  程序运行结果:

  

四、参考资料

  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

linux
相关资讯       Netty  Netty客户端创建 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款