个人随笔
目录
netty(二)、channelGroup.writeAndFlush发送消息客户端接收不到的原因
2021-01-20 23:42:33

问题

我们netty做一个很简单的聊天程序,发现用如下的语句发送消息,没有任何效果,客户端也没有接收得到

  1. channelGroup.writeAndFlush(【客户端】"+remoteAddress+"已下线 "+format.format(new Date()));

原因

我就纳闷了,为啥不行,原来在网络上传播的数据都是字节(其实也就是二进制数据)类型。我们如果直接向网络流里面写入一个对象(如:String对象),是无法传输的。只有将对象序列化(转换为可以传输的字节类型)之后,才可以进行传输。所以问题的根源就很清楚了,需要把字符串(”Netty test”)转换成字节进行传输。

解决方案

1、转换成字节

  1. channelGroup.writeAndFlush(Unpooled.copiedBuffer(【客户端】"+remoteAddress+"已下线 "+format.format(new Date()), CharsetUtil.UTF_8));

然后接收的时候也要做如下处理:

  1. //读取数据事件
  2. @Override
  3. public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
  4. ByteBuf buf = (ByteBuf)msg;
  5. System.out.println("服务端发来的消息:"+buf.toString(CharsetUtil.UTF_8));
  6. }

如果想直接使用字符串,也可以添加编码解码器即可。

2、添加编码解码器

  1. @Override
  2. protected void initChannel(SocketChannel sc) throws Exception {
  3. sc.pipeline().addLast(new StringEncoder());//对 String 对象自动编码,属于出站站处理器
  4. sc.pipeline().addLast(new StringDecoder());//把网络字节流自动解码为 String 对象,属于入站处理器
  5. sc.pipeline().addLast(new NettyServerHandler());
  6. }

当然客户端也要添加。

 4183

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2