Netty-简单Server端

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 NettyServer {

    public static void main(String[] args) throws InterruptedException {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();


        //创建服务器的启动器,并配置启动器
        ServerBootstrap bootstrap = new ServerBootstrap();

        try {
            bootstrap.group(bossGroup, workerGroup)//设置两个线程组
                    .channel(NioServerSocketChannel.class)//使用NIOServerSocketChannel作为通道的实现
                    .option(ChannelOption.SO_BACKLOG, 128)//设置线程队列的连接个数
                    .childOption(ChannelOption.SO_KEEPALIVE, true)//
                    .childHandler(new ChannelInitializer<SocketChannel>() {//创建一个通道对象

                        //给pipeline设置处理器
                        @Override
                        protected void initChannel(SocketChannel socketChannel) throws Exception {
                            socketChannel.pipeline().addLast(new NettyServerHandler());
                        }
                    });

            ChannelFuture cf = bootstrap.bind(6666).sync();

            cf.channel().closeFuture().sync();

        }catch (Exception e){
            System.out.println(e.getMessage());
        }finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

import java.nio.charset.Charset;

/*
 *@Date: 2021-02-19 21:00
 */
public class NettyServerHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("server ctx = " + ctx);
        ByteBuf byteBuf = (ByteBuf) msg;
        System.out.println("client address : "+ctx.channel().remoteAddress());
        System.out.println("client : "+byteBuf.toString(Charset.forName("GBK")));
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello.阿萨德",Charset.forName("GBK")));
    }

    //异常处理
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }
}

其基本就是为了使用Netty的API,熟悉其整个流程,它是如何封装NIO的,与NIO的区别是什么,都可以先通过API的使用来逐渐摸索。

这里得注意其Server端的编码必须与其Client端相互统一,才能不会产生乱码,由于我自己在使用Client的时候,是使用软件进行连接Server的,而不是自己手动编写Client,会导致其中文乱码,是因为Client程序使用的GBK编码,所以在输出中文的时候,Server端也需要进行GBK的解码,才能解决中文乱码问题,所以在建立与服务端连接的时候,以及服务端编写的时候,要注意与Client端编写的人员相互统一,具体使用什么样的编码格式,才能不产生乱码.

Netty-简单Server端

上一篇:027.NET5_Autofac通过抽象支持AOP


下一篇:js对象的遍历