一、客户端发送数据到服务端
1.示例代码:
.handler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new FirstClientHandler());
}
});
ch.pipeline()返回的是和这条连接相关的逻辑处理链,采用的是责任链模式。
调用addLast()方法添加一个逻辑处理器,其作用是建立连接成功后向服务端写数据
public class FirstClientHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelActive(ChannelHandlerContext ctx) {
System.out.println(new Date() + ": 客户端写出数据");
// 1. 获取数据
ByteBuf buffer = getByteBuf(ctx);
// 2. 写数据
ctx.channel().writeAndFlush(buffer);
}
private ByteBuf getByteBuf(ChannelHandlerContext ctx) {
// 1. 获取二进制抽象 ByteBuf
ByteBuf buffer = ctx.alloc().buffer();
// 2. 准备数据,指定字符串的字符集为 UTF-8
byte[] bytes = "你好,闪电侠!".getBytes(Charset.forName("utf
8"));
// 3. 填充数据到 ByteBuf
buffer.writeBytes(bytes);
return buffer;
}
}
首先获取一个Netty对二进制数的抽象ByteBuf,ctx.alloc()获取一个ByteBuf的内存管理器,然后将二进制数据填充到ByteBuf,最后调用ctx.channel().writeAndFlush()把数据写到服务端。
从以上代码中可以看出,Netty里的数据是以ByteBuf为单位的,所需要写的数据必须放在一个ByteBuf中,读数据也如此。
二、服务端读取客户端数据
1.示例代码:
public class FirstServerHandler extends ChannelInboundHandlerAdapter
{
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ByteBuf byteBuf = (ByteBuf) msg;
System.out.println(new Date() + ": 服务端读到数据
> " + byteBuf.toString
(Charset.forName("utf-8")));
}
}
服务端覆盖的方法是channelRead()方法
三、服务端返回数据到客户端
1.示例代码(服务端写信息):
public class FirstServerHandler extends ChannelInboundHandlerAdapter
{ @Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
// 接收数据逻辑省略
// 返回数据到客户端
System.out.println(new Date() + ": 服务端写出数据");
ByteBuf out = getByteBuf(ctx);
ctx.channel().writeAndFlush(out);
}
private ByteBuf getByteBuf(ChannelHandlerContext ctx) {
byte[] bytes = "你好,我是DawnEillen!".getBytes
(Charset.forName("utf-8"));
ByteBuf buffer = ctx.alloc().buffer();
buffer.writeBytes(bytes);
return buffer;
}
}
2.示例代码(客户端读信息):
public class FirstClientHandler extends ChannelInboundHandlerAdapter {
// 写数据相关的逻辑省略
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ByteBuf byteBuf = (ByteBuf) msg;
System.out.println(new Date() + ": 客户端读到数据
> " + byteBuf.toString
(Charset.forName("utf-8")));
}
}
3.运行结果: