Netty实现TCP通信
1 基本步骤
2 具体代码
2.1 服务端代码
/**
* @desc: Server端
* @author: YanMingXin
* @create: 2021/9/27-15:30
**/
public class NettyTcpServer {
public static void main(String[] args) {
//boosGroup处理连接请求
NioEventLoopGroup boosGroup = new NioEventLoopGroup();
//workGroup处理真正的业务逻辑
NioEventLoopGroup workGroup = new NioEventLoopGroup();
//服务端启动对象
ServerBootstrap bootstrap = new ServerBootstrap();
//配置启动对象参数
//设置两个线程组
bootstrap.group(boosGroup, workGroup)
//channel类型为NioServerSocketChannel
.channel(NioServerSocketChannel.class)
//线程队列的连接个数
.option(ChannelOption.SO_BACKLOG, 128)
//线程队列的状态
.childOption(ChannelOption.SO_KEEPALIVE, true)
//配置子处理器(匿名类)
.childHandler(new ChannelInitializer<SocketChannel>() {
/**
* 初始化阶段
* @param socketChannel
* @throws Exception
*/
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline()
.addLast(new NettyTcpServerHandler());
}
/**
* 发生异常处理
* @param ctx
* @param cause
* @throws Exception
*/
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
super.exceptionCaught(ctx, cause);
}
/**
* 添加新的处理器
* @param ctx
* @throws Exception
*/
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
super.handlerAdded(ctx);
}
});
try {
//绑定端口
ChannelFuture channelFuture = bootstrap.bind(8888).sync();
//关闭通道监听
channelFuture.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//关闭连接
boosGroup.shutdownGracefully();
workGroup.shutdownGracefully();
}
}
/**
* 自定义Handler
*/
static class NettyTcpServerHandler extends ChannelInboundHandlerAdapter {
/**
* 管道读取数据
*
* @param ctx
* @param msg
* @throws Exception
*/
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ByteBuf byteBuf = (ByteBuf) msg;
System.out.println(byteBuf.toString(StandardCharsets.UTF_8));
System.out.println(ctx.channel().remoteAddress());
}
/**
* 读取数据完毕
*
* @param ctx
* @throws Exception
*/
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
ctx.writeAndFlush(Unpooled.copiedBuffer("Hello World,I am Server.", CharsetUtil.UTF_8));
}
/**
* 异常处理
*
* @param ctx
* @param cause
* @throws Exception
*/
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
//super.exceptionCaught(ctx, cause);
ctx.close();
}
}
}
2.2 客户端代码
/**
* @desc: Client端
* @author: YanMingXin
* @create: 2021/9/27-15:30
**/
public class NettyTcpClient {
public static void main(String[] args) {
//处理连接请求的NioEventLoopGroup
NioEventLoopGroup nioEventLoopGroup = new NioEventLoopGroup();
//服务对象
Bootstrap bootstrap = new Bootstrap();
//配置服务参数
bootstrap.group(nioEventLoopGroup)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline().addLast(new NettyTcpClientHandler());
}
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
super.exceptionCaught(ctx, cause);
}
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
super.handlerAdded(ctx);
}
});
//连接服务器端
ChannelFuture connect = bootstrap.connect("127.0.0.1", 8888);
try {
//关闭连接
connect.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//关闭连接
nioEventLoopGroup.shutdownGracefully();
}
}
/**
* 处理器
*/
static class NettyTcpClientHandler extends ChannelInboundHandlerAdapter {
/**
* 管道就绪则处理该方法
*
* @param ctx
* @throws Exception
*/
public void channelActive(ChannelHandlerContext ctx) throws Exception {
ctx.writeAndFlush(Unpooled.copiedBuffer("Hello World,I am Client.", CharsetUtil.UTF_8));
}
/**
* 通道读取事件时会触发
*
* @param ctx
* @param msg
* @throws Exception
*/
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ByteBuf byteBuf = (ByteBuf) msg;
System.out.println(byteBuf.toString(CharsetUtil.UTF_8));
System.out.println(ctx.channel().remoteAddress());
}
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
ctx.close();
}
}
}