【问题标题】:Invalid stream header 434B0005 from client to server从客户端到服务器的流标头 434B0005 无效
【发布时间】:2013-02-26 03:38:37
【问题描述】:

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

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

    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 或任何东西。

【问题讨论】:

    标签: java serialization tcp objectoutputstream objectinputstream


    【解决方案1】:

    我没有初始化多个 ObjectOutputStreams 或任何东西。

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

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

    【讨论】:

    • 我会调整代码以反映您的建议,看看是否可行。你能澄清一下为什么它只会打破一个方向吗?你表示我得到了我需要读错的字节数,这让我不知何故失去了同步;如果可以从我发布的代码中收集到,那是什么原因造成的?
    • 以某种方式失去同步是问题的唯一合乎逻辑的解释。我不知道你所说的“单向”是什么意思,但代码不一定有 100% 的错误率。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2011-10-19
    相关资源
    最近更新 更多