问题
我们netty做一个很简单的聊天程序,发现用如下的语句发送消息,没有任何效果,客户端也没有接收得到
channelGroup.writeAndFlush(【客户端】"+remoteAddress+"已下线 "+format.format(new Date()));
原因
我就纳闷了,为啥不行,原来在网络上传播的数据都是字节(其实也就是二进制数据)类型。我们如果直接向网络流里面写入一个对象(如:String对象),是无法传输的。只有将对象序列化(转换为可以传输的字节类型)之后,才可以进行传输。所以问题的根源就很清楚了,需要把字符串(”Netty test”)转换成字节进行传输。
解决方案
1、转换成字节
channelGroup.writeAndFlush(Unpooled.copiedBuffer(【客户端】"+remoteAddress+"已下线 "+format.format(new Date()), CharsetUtil.UTF_8));
然后接收的时候也要做如下处理:
//读取数据事件
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ByteBuf buf = (ByteBuf)msg;
System.out.println("服务端发来的消息:"+buf.toString(CharsetUtil.UTF_8));
}
如果想直接使用字符串,也可以添加编码解码器即可。
2、添加编码解码器
@Override
protected void initChannel(SocketChannel sc) throws Exception {
sc.pipeline().addLast(new StringEncoder());//对 String 对象自动编码,属于出站站处理器
sc.pipeline().addLast(new StringDecoder());//把网络字节流自动解码为 String 对象,属于入站处理器
sc.pipeline().addLast(new NettyServerHandler());
}
当然客户端也要添加。