You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:24:02