Netty连接池无法向服务器发送消息问题排查
Netty连接池发送TCP消息无响应问题解决
问题背景
我刚踩了个Netty连接池的坑,分享给大家参考:我实现了一个基于Netty SimpleChannelPool的连接池客户端(NettyConnectionPoolClientApplication),通过HTTP端点向普通ServerSocket服务端发送TCP消息。结果遇到了诡异的情况:
- 服务端能正常检测到客户端连接,但完全接收不到任何消息
- 用telnet或者不带连接池的纯Netty客户端测试时,服务端却能正常接收并处理消息
- 所用Netty版本:4.1.39.Final
排查过程
给Channel添加监听后,终于抓到了关键报错:
java.lang.UnsupportedOperationException: unsupported message type: String (expected: ByteBuf, FileRegion)
原因分析
Netty的Channel发送数据时,默认只认ByteBuf或FileRegion类型的消息载体。我之前图省事直接把String对象传给writeAndFlush(),完全不符合Netty的消息处理规范,导致消息根本没被正确发送出去,服务端自然收不到。
解决方案
把要发送的字符串转换为ByteBuf对象再发送就行,示例代码如下:
ch.writeAndFlush(Unpooled.wrappedBuffer((msg + System.lineSeparator()).getBytes()));
这里用Unpooled.wrappedBuffer把字符串的字节数组包装成ByteBuf,同时加上换行符(和telnet的行为保持一致,确保服务端能正确识别消息边界)。修改完之后,服务端就能正常接收消息了。
内容的提问来源于stack exchange,提问作者Marko Vranjkovic
相关产品推荐
相关产品推荐

