java - 从客户端到服务器的流 header 434B0005 无效

标签 java serialization tcp objectoutputstream objectinputstream

我已经序列化了一些对象,以便可以将它们转换为 TCP 数据包的字节数组。当我将对象从服务器程序发送到客户端程序时,没有任何问题并且工作正常。但是,即使服务器和客户端之间的代码相同,当我尝试将对象从客户端发送到服务器时,我得到一个无效的 header 。

这是我正在序列化的对象:

    public static byte[] serialize(Hand c) throws IOException
    {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(c);
        return baos.toByteArray();
    }

    public static Hand deserialize(byte[] bytes) throws IOException, ClassNotFoundException
    {
        ByteArrayInputStream b = new ByteArrayInputStream(bytes);
        ObjectInputStream o = new ObjectInputStream(b);
        return (Hand) o.readObject();
    }

    public static byte[] serialize(Card c) throws IOException
    {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(c);
        return baos.toByteArray();
    }

    public static Card deserialize(byte[] bytes) throws IOException, ClassNotFoundException
    {
        ByteArrayInputStream b = new ByteArrayInputStream(bytes);
        ObjectInputStream o = new ObjectInputStream(b);
        return (Card) o.readObject();
    }

它们都取自服务器程序,但服务器和客户端之间的序列化代码是相同的;我非常重视从服务器到客户端的 Card 类和 Hand 类,以确保不会发生这样的错误。

服务器可以将 Card 或 Hand 转换为 byte[] 并将其通过 DataOutputStream 写入客户端,客户端可以通过 DataInputStream 接收 Card 或 Hand,反序列化并毫无问题地读取它。然而,当我尝试从客户端向服务器发送一张牌或一手牌时,它很少起作用,通常我会得到一个

Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 434B0005
    at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
    at java.io.ObjectInputStream.<init>(Unknown Source)
    at Hand.deserialize(Hand.java:29)
    at KoiKoi_TCP_Server.takeClientTurn(KoiKoi_TCP_Server.java:321)
    at KoiKoi_TCP_Server.main(KoiKoi_TCP_Server.java:380)

Hand.java.29 指向该线的位置

        ObjectInputStream o = new ObjectInputStream(b);

在Hand反序列化方法中。

我知道它告诉我标题无效。我不知道如何修复它,因为它只会破坏一个方向并且代码是相同的。有建议吗?

我一次只发送一个对象,所以我没有初始化多个 ObjectInputStreams 或任何东西。

最佳答案

I'm not initializing multiple ObjectOutputStreams or anything.

是的,你是。您正在为每个对象初始化一个新的 ObjectOutputStream,然后您给自己带来了额外的问题,即知道要读取多少字节才能接收每个对象,而您会犯这个错误,因此您会失去同步.

摆脱这一切。你不需要它。这只是增加问题而已。只需在套接字的生命周期内直接使用单个 ObjectOutputStream 和 ObjectInputStream,直接在套接字流上构建,并在要发送对象时调用 writeObject() ,在要读取对象时调用 readObject() 。两行代码。完全忘记字节数组和 ByteArray/DataInput/OutputStreams。

关于java - 从客户端到服务器的流 header 434B0005 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15330492/

相关文章:

c# - 使用 Json.NET 的自定义反序列化

Python TCP编程

networking - 实现类似于 Spotify 的音频流服务

java - Java 到 Scala 中的常见习惯用法,遍历/迭代 Java 列表到 Scala 列表

java - Elasticsearch 中的节点

java - 合规性验证(正则表达式)

c# - 序列化 RSS 提要容器?

java - 在 DAO 中使用准备好的语句检索数据时出现问题

Java RMI 异常错误

c++ - Boost::Asio : io_service.run() vs poll() 或者我如何在主循环中集成 boost::asio