本文共 4229 字,大约阅读时间需要 14 分钟。
一、引入依赖
在项目中首先需要配置所需的依赖包。Netty作为依赖包需要手动添加,建议访问Maven仓库获取最新版本。以下是常用的依赖配置:
io.netty netty-all 4.1.25.Final org.projectlombok lombok 1.16.22
二、服务器端实现
完成依赖配置后,接下来编写服务器端代码。以下是一个简单的Netty服务器实现:
public class LiuServer { private final int port; public LiuServer(int port) { this.port = port; } public static void main(String[] args) throws Exception { int port = 8888; new LiuServer(port).start(); } public void start() throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .localAddress(new InetSocketAddress(port)) .childHandler(new ChannelInitializer () { @Override public void initChannel(SocketChannel ch) { ch.pipeline().addLast(new LiuServerHandler()); } }); ChannelFuture f = b.bind().sync(); System.out.println(LiuServer.class.getName() + " 服务启动开始监听端口:" + f.channel().localAddress()); f.channel().closeFuture().sync(); } finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } }}//服务器处理类@ChannelHandler.Sharablepublic class LiuServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { ByteBuf in = (ByteBuf) msg; System.out.println("客户端发来消息: " + in.toString(CharsetUtil.UTF_8)); ctx.write(in); } @Override public void channelReadComplete(ChannelHandlerContext ctx) { System.out.println("channel 通道读取完成"); ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { cause.printStackTrace(); ctx.close(); }} 三、客户端实现
客户端需要连接到服务器,以下是一个简单的Netty客户端实现:
public class LiuClient { private final String host; private final int port; public LiuClient(String host, int port) { this.host = host; this.port = port; } public static void main(String[] args) throws Exception { final String host = "127.0.0.1"; final int port = 8888; new LiuClient(host, port).start(); } public void start() throws Exception { EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); b.group(group) .channel(NioSocketChannel.class) .remoteAddress(new InetSocketAddress(host, port)) .handler(new ChannelInitializer () { @Override public void initChannel(SocketChannel ch) { ch.pipeline().addLast(new LiuClientHandler()); } }); ChannelFuture f = b.connect().sync(); f.channel().closeFuture().sync(); } finally { group.shutdownGracefully(); } }}//客户端处理类@ChannelHandler.Sharablepublic class LiuClientHandler extends SimpleChannelInboundHandler { @Override public void channelActive(ChannelHandlerContext ctx) { ctx.writeAndFlush(Unpooled.copiedBuffer("Hello Netty! " + Long.toString(System.currentTimeMillis()), CharsetUtil.UTF_8)); } @Override public void channelRead0(ChannelHandlerContext ctx, ByteBuf in) { System.out.println("服务器发来消息: " + in.toString(CharsetUtil.UTF_8)); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { cause.printStackTrace(); ctx.close(); }} 以上代码提供了一个完整的Netty服务器端和客户端实现,适用于基础的网络通信应用开发。
转载地址:http://mton.baihongyu.com/