channel || channelGroup || ctx.writeAndFlush()发送字符串消息客户端接收不到的原因

Posted chenry777

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了channel || channelGroup || ctx.writeAndFlush()发送字符串消息客户端接收不到的原因相关的知识,希望对你有一定的参考价值。

一、原因

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

二、解决办法

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());

客户端同理

以上是关于channel || channelGroup || ctx.writeAndFlush()发送字符串消息客户端接收不到的原因的主要内容,如果未能解决你的问题,请参考以下文章

channel || channelGroup || ctx.writeAndFlush()发送字符串消息客户端接收不到的原因

Netty ChannelGroup

ChannelGroup和DefaultChannelGroup

netty集群channel怎么跨集群

netty4在channel.writeAndFlush为啥还阻塞延迟

在 Netty5 中,如果我有 channelID 字符串,如何获取 Channel?