zoukankan      html  css  js  c++  java
  • Netty入门(一)环境搭建及使用

    一、项目创建

      在 Eclipse 中右键,新建->项目->Maven->Maven Project->下一步->选择 quickstart

      

      下一步->设置如图(参数自取)

      

      点击完成。

       项目会自动创建 pom.xml 文件,打开该文件,点击 Dependencies标签->Add..,设置如图(参数由 Netty 版本决定):

      

      点击 OK,保存文件,观察 Maven Dependencies 下,

      

      netty 的 jar 包已经添加完毕。到此为止,项目配置完毕了,下面就来添加代码吧。

    二、实现一个简单的服务端 demo

    1. 首选我们需要自定义一个类处理服务器接收到的消息

     1 package com.coder.server;
     2 
     3 import io.netty.buffer.ByteBuf;
     4 import io.netty.channel.ChannelHandlerContext;
     5 import io.netty.channel.ChannelInboundHandlerAdapter;
     6 import io.netty.util.CharsetUtil;
     7 import io.netty.util.ReferenceCountUtil;
     8 
     9 /**
    10  * 输出接收到的消息
    11  * @author Coder
    12  *
    13  */
    14 public class HelloServerHandler extends ChannelInboundHandlerAdapter {
    15     /**
    16      * 收到数据时调用
    17      */
    18     @Override
    19     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    20         try {
    21             ByteBuf in = (ByteBuf)msg;
    22             System.out.print(in.toString(CharsetUtil.UTF_8));
    23         } finally {
    24             // 抛弃收到的数据
    25             ReferenceCountUtil.release(msg);
    26         }
    27         
    28 //        ctx.write(msg);
    29 //        ctx.flush();
    30     }
    31     
    32     /**
    33      * 当Netty由于IO错误或者处理器在处理事件时抛出异常时调用
    34      */
    35     @Override
    36     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    37         // 当出现异常就关闭连接
    38         cause.printStackTrace();
    39         ctx.close();
    40     }
    41 }

      该类主要是实现了接收客户端发来的消息,并输出到控制台。

    2. 然后我们就能实现一个简单的服务端程序了

      Netty 服务器的通信步骤为:

    1.  创建两个NIO线程组,一个专门用于接收来自客户端的连接,另一个则用于处理已经被接收的连接。
    2.  创建一个ServerBootstrap对象,配置Netty的一系列参数,例如接受传出数据的缓存大小等。
    3.  创建一个用于实际处理数据的类ChannelInitializer,进行初始化的准备工作,比如设置接受传出数据的字符集、格式以及实际处理数据的接口。
    4.  绑定端口,执行同步阻塞方法等待服务器端启动即可。
     1 package com.coder.server;
     2 
     3 import io.netty.bootstrap.ServerBootstrap;
     4 import io.netty.channel.ChannelFuture;
     5 import io.netty.channel.ChannelInitializer;
     6 import io.netty.channel.ChannelOption;
     7 import io.netty.channel.EventLoopGroup;
     8 import io.netty.channel.nio.NioEventLoopGroup;
     9 import io.netty.channel.socket.SocketChannel;
    10 import io.netty.channel.socket.nio.NioServerSocketChannel;
    11 
    12 public class HelloServer {
    13     private int port;
    14     
    15     public HelloServer(int port) {
    16         this.port = port;
    17     }
    18     
    19     public void run() throws Exception {
    20         EventLoopGroup bossGroup = new NioEventLoopGroup();        // 用来接收进来的连接
    21         EventLoopGroup workerGroup = new NioEventLoopGroup();    // 用来处理已经被接收的连接
    22         System.out.println("准备运行端口:" + port);
    23         
    24         try {
    25             ServerBootstrap b = new ServerBootstrap();
    26             b.group(bossGroup, workerGroup)
    27             .channel(NioServerSocketChannel.class)            // 这里告诉Channel如何接收新的连接
    28             .childHandler( new ChannelInitializer<SocketChannel>() {
    29                 @Override
    30                 protected void initChannel(SocketChannel ch) throws Exception {
    31                     // 自定义处理类
    32                     ch.pipeline().addLast(new HelloServerHandler());
    33                 }
    34             })
    35             .option(ChannelOption.SO_BACKLOG, 128)
    36             .childOption(ChannelOption.SO_KEEPALIVE, true);
    37             
    38             // 绑定端口,开始接收进来的连接
    39             ChannelFuture f = b.bind(port).sync();
    40             
    41             // 等待服务器socket关闭
    42             f.channel().closeFuture().sync();
    43         } catch (Exception e) {
    44             workerGroup.shutdownGracefully();
    45             bossGroup.shutdownGracefully();
    46         }
    47     }
    48     
    49     public static void main(String[] args) throws Exception {
    50         int port = 10110;
    51         new HelloServer(port).run();
    52     }
    53 
    54 }

       那么,这便是一个可执行的服务端程序了。运行后控制台输出如下:

      

    三、测试 

       我们可以去自定义客户端程序,这里为了方便使用 telnet 充当客户端。

      需要注意的是,Windows 默认是没有开启 telnet 客户端的,需要我们手动开启。

      菜单->控制面板->程序->打开或关闭Windows功能,设置如图:

      

      这样我们就能用 telnet 客户端了。

      在 cmd 窗口输入命令如下:

      

      打开窗口如下:

      

      这时候我们在该窗口输入什么,eclipse 控制台也会对应输出相应内容。如下:

      

      注意:telnet 窗口会看不到输入的字符,只要输入 ctrl+L 就可以看到输入的字符了。

  • 相关阅读:
    分解质因数算法
    js 的 Math 对象
    字符串操作
    简化求质数算法
    数值类型小数点后是否可以接零问题
    新博第一篇,思考的重要性与求质数算法
    一、制作屏幕录像
    四、同步线程
    常见问题
    jni数据处理
  • 原文地址:https://www.cnblogs.com/coderJiebao/p/Netty01.html
Copyright © 2011-2022 走看看