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 就可以看到输入的字符了。

  • 相关阅读:
    安装composer后报错proc_open(): fork failed
    ZOJ4063 Tournament [The 2018 ACM-ICPC Asia Qingdao Regional Contest]
    BZOJ1191: [HNOI2006]超级英雄Hero
    BZOJ1270: [BeijingWc2008]雷涛的小猫
    BZOJ1303 [CQOI2009]中位数图
    BZOJ1192 [HNOI2006]鬼谷子的钱袋
    BZOJ1003 [ZJOI2006]物流运输 最短路+DP
    牛客国庆集训派对Day6 E-Growth
    BZOJ2208 [Jsoi2010]连通数
    BZOJ2761 [JLOI2011]不重复数字
  • 原文地址:https://www.cnblogs.com/coderJiebao/p/Netty01.html
Copyright © 2011-2022 走看看