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端编写的人员相互统一,具体使用什么样的编码格式,才能不产生乱码.
原文:https://www.cnblogs.com/xiaoyuu/p/14418703.html