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()发送字符串消息客户端接收不到的原因
ChannelGroup和DefaultChannelGroup