Netty入門Demo使用

實現一個簡單的服務端 demo

1、maven項目添加netty的jar

2、自定義一個類處理服務器接收到的消息,該類主要是實現了接收客戶端發來的消息,並輸出到控制檯。

package com.coder.server;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
import io.netty.util.ReferenceCountUtil;

/**
 * 輸出接收到的消息
 * @author Coder
 *
 */
public class HelloServerHandler extends ChannelInboundHandlerAdapter {
    /**
     * 收到數據時調用
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        try {
            ByteBuf in = (ByteBuf)msg;
            System.out.print(in.toString(CharsetUtil.UTF_8));
        } finally {
            // 拋棄收到的數據
            ReferenceCountUtil.release(msg);
        }
        
//        ctx.write(msg);
//        ctx.flush();
    }
    
    /**
     * 當Netty由於IO錯誤或者處理器在處理事件時拋出異常時調用
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        // 當出現異常就關閉連接
        cause.printStackTrace();
        ctx.close();
    }
}

3、然後我們就能實現一個簡單的服務端程序了

  Netty 服務器的通信步驟爲:

  1.  創建兩個NIO線程組,一個專門用於接收來自客戶端的連接,另一個則用於處理已經被接收的連接。
  2.  創建一個ServerBootstrap對象,配置Netty的一系列參數,例如接受傳出數據的緩存大小等。
  3.  創建一個用於實際處理數據的類ChannelInitializer,進行初始化的準備工作,比如設置接受傳出數據的字符集、格式以及實際處理數據的接口。
  4.  綁定端口,執行同步阻塞方法等待服務器端啓動即可
package com.coder.server;

import io.netty.bootstrap.ServerBootstrap;
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.NioServerSocketChannel;

public class HelloServer {
    private int port;
    
    public HelloServer(int port) {
        this.port = port;
    }
    
    public void run() throws Exception {
        EventLoopGroup bossGroup = new NioEventLoopGroup();        // 用來接收進來的連接
        EventLoopGroup workerGroup = new NioEventLoopGroup();    // 用來處理已經被接收的連接
        System.out.println("準備運行端口:" + port);
        
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
            .channel(NioServerSocketChannel.class)            // 這裏告訴Channel如何接收新的連接
            .childHandler( new ChannelInitializer<SocketChannel>() {
                @Override
                protected void initChannel(SocketChannel ch) throws Exception {
                    // 自定義處理類
                    ch.pipeline().addLast(new HelloServerHandler());
                }
            })
            .option(ChannelOption.SO_BACKLOG, 128)
            .childOption(ChannelOption.SO_KEEPALIVE, true);
            
            // 綁定端口,開始接收進來的連接
            ChannelFuture f = b.bind(port).sync();
            
            // 等待服務器socket關閉
            f.channel().closeFuture().sync();
        } catch (Exception e) {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }
    
    public static void main(String[] args) throws Exception {
        int port = 10110;
        new HelloServer(port).run();
    }

}

 

二、測試 

   我們可以去自定義客戶端程序,這裏爲了方便使用 telnet 充當客戶端。

  需要注意的是,Windows 默認是沒有開啓 telnet 客戶端的,需要我們手動開啓。

  菜單->控制面板->程序->打開或關閉Windows功能,設置如圖:

原文鏈接:https://www.cnblogs.com/coderJiebao/p/Netty01.html