编程技术分享平台

网站首页 > 技术教程 正文

netty writeAndFlush 客户端接收不到的原因

xnh888 2024-11-05 12:56:04 技术教程 19 ℃ 0 评论

问题

我们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());
}

当然客户端也要添加。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表