目录
在深入学习Netty之前,首先编写一段简单的服务端和客户端程序,来体验一下Netty是如何进行交互的。
-
服务端程序
public class NettyServer {
public static void main(String[] args) throws InterruptedException {
NioEventLoopGroup boss = new NioEventLoopGroup();
NioEventLoopGroup work = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(work, boss)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 1024)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new ServerChannelHandler());
}
});
ChannelFuture sync = bootstrap.bind(9910).sync();
sync.channel().closeFuture().sync();
} finally {
work.shutdownGracefully();
boss.shutdownGracefully();
}
}
private static class ServerChannelHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof ByteBuf) {
ByteBuf buf = (ByteBuf) msg;
byte[] bytes = new byte[buf.readableBytes()];
buf.getBytes(0, bytes, 0, buf.readableBytes());
System.out.println("Server accept message : " + new String(bytes, Charset.defaultCharset()));
ctx.writeAndFlush(Unpooled.wrappedBuffer("this is server ... ".getBytes(Charset.defaultCharset())));
}
}
}
}
大家可以先运行main方法,然后在浏览器中访问如下地址:
然后查看开发工具的控制台,可以看到如下图所示的输出内容:
如果看到如图所示的内容,那么恭喜你,你的第一个Netty的服务端程序编写成功了。
-
客户端程序
public class NettyClient {
public static void main(String[] args) throws InterruptedException {
NioEventLoopGroup work = new NioEventLoopGroup();
try {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(work)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new ClientChannelHandler());
}
});
ChannelFuture sync = bootstrap.connect("127.0.0.1", 9910).sync();
sync.channel().closeFuture().sync();
} finally {
work.shutdownGracefully();
}
}
private static class ClientChannelHandler extends ChannelDuplexHandler {
@Override
public void channelActive(ChannelHandlerContext ctx) {
ctx.writeAndFlush(Unpooled.wrappedBuffer("this is client ...".getBytes(Charset.defaultCharset())));
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof ByteBuf) {
ByteBuf buf = (ByteBuf) msg;
byte[] bytes = new byte[buf.readableBytes()];
buf.getBytes(0, bytes, 0, buf.readableBytes());
System.out.println("Client accept message : " + new String(bytes, Charset.defaultCharset()));
ctx.close();
}
}
}
}
启动客户端程序后,查看控制台有内容输出,表示你的客户端程序也成功了。