TCP客户端发送字节数组 Netty服务端接收内容不一致问题咨询
问题根因
你客户端的发送逻辑确实存在问题:你用了ObjectOutputStream的writeObject()方法发送字节数组,这个流是Java自带的序列化工具,写入对象时会自动添加序列化标识、类元数据、对象属性描述等额外的序列化头信息,你服务端收到的多出来的那些字节就是这些序列化附加内容,原始的[0x06, 0x12]其实在你贴出的服务端收到的字节数组最后两位,对应6, 18(18就是0x12的十进制值)。
客户端代码调整方案
直接使用Socket的原生OutputStream写入字节数组即可,不需要走对象序列化逻辑,修改后的代码如下:
byte[] byteArray = new byte[]{(byte) 0x01, (byte) 0x12}; try (Socket socket = new Socket(host, port)) { // 直接获取输出流写原始字节,不要用ObjectOutputStream OutputStream outputStream = socket.getOutputStream(); outputStream.write(byteArray); outputStream.flush(); // 如果需要读服务端返回的原始字节,也用InputStream直接读 InputStream inputStream = socket.getInputStream(); // 这里可根据实际返回长度调整读取逻辑,示例为简单读取全部返回 byte[] response = inputStream.readAllBytes(); return response; } catch (Exception ex) { LOGGER.error("exception occurred" + ex.getMessage()); ex.printStackTrace(); return "Exception"; }
额外注意事项
- 如果你的服务端Netty没有设置拆包粘包处理逻辑,后续发送大于TCP缓冲区的数据包时可能会出现半包、粘包问题,建议在通信协议里增加固定长度头或者特殊分隔符来做帧拆分。
- 如果你确实需要两端都用Java序列化传递对象,那服务端也需要用对应的
ObjectInputStream来解析收到的字节才能拿到原始对象,不过这种方式不推荐跨语言场景使用,且序列化后的体积冗余较高。
内容的提问来源于stack exchange,提问作者Abinaya LK
相关产品推荐
相关产品推荐

