本文共 4659 字,大约阅读时间需要 15 分钟。
Netty框架的基础上,以下是一个客户端和服务器端的实现代码示例
客户端代码:
package netty2;import io.netty.bootstrap.Bootstrap;import io.netty.buffer.ByteBuf;import io.netty.buffer.Unpooled;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel;import io.netty.channel.socket.nio.NioSocketChannel;import java.net.InetSocketAddress;public class EchoClient { public static void main(String[] args) throws Exception { int port = 8001; final EchoClientHandler clientHandler = new EchoClientHandler(); EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); b.group(eventLoopGroup) .channel(NioSocketChannel.class) .remoteAddress(new InetSocketAddress("localhost", port)) .handler(new ChannelInitializer() { @Override protected void initChannel(SocketChannel socketChannel) throws Exception { socketChannel.pipeline().addLast(clientHandler); } }); final ChannelFuture f = b.connect(); f.addListener(new GenericFutureListener () { @Override public void operationComplete(Future future) throws Exception { if (future.isSuccess()) { System.out.println("已经连接到服务器!"); ByteBuf byteBuf = Unpooled.copiedBuffer("aaaaaaaaaaaaaaaa", Charset.defaultCharset()); ChannelFuture channelFuture = f.channel().writeAndFlush(byteBuf); } else { Throwable throwable = future.cause(); throwable.printStackTrace(); } } }); f.channel().closeFuture().sync(); } catch (InterruptedException e) { eventLoopGroup.shutdownGracefully().sync(); } }}
服务器端代码:
package netty2;import io.netty.bootstrap.ServerBootstrap;import io.netty.buffer.ByteBufAllocator;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelPipeline;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel;import io.netty.channel.socket.nio.NioServerSocketChannel;import java.net.InetSocketAddress;public class EchoServer { public static void main(String[] args) throws Exception { int port = 8001; EchoServerFirstInHandler firstHandler = new EchoServerFirstInHandler(); EchoServerSecondInHandler secondHandler = new EchoServerSecondInHandler(); EchoServerOutHandler outHandler = new EchoServerOutHandler(); EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); try { ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(eventLoopGroup) .channel(NioServerSocketChannel.class) .localAddress(new InetSocketAddress(port)) .childHandler(new ChannelInitializer() { @Override protected void initChannel(SocketChannel socketChannel) throws Exception { ChannelPipeline channelPipeline = socketChannel.pipeline(); channelPipeline.addFirst(outHandler); channelPipeline.addLast(firstHandler); channelPipeline.addLast(secondHandler); } }); ChannelFuture f = serverBootstrap.bind().sync(); f.channel().closeFuture().sync(); } catch (InterruptedException e) { eventLoopGroup.shutdownGracefully().sync(); } }}
辅助处理器类:
package netty2;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;public class EchoServerOutHandler extends ChannelOutboundHandlerAdapter { public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { System.out.println("EchoServerOutHandler write: " + ((ByteBuf) msg).toString(Charset.defaultCharset())); ctx.write(msg, promise); }}
以上代码示例展示了Netty框架在TCP协议中实现Echo协议的客户端和服务器端通信,基于NIO机制,支持非阻塞IO。通过Bootstrap类进行异步连接,采用分段读写的策略,确保高效处理大量数据流量。
转载地址:http://kydo.baihongyu.com/