从客户端到服务器的流标头434B0005无效

时间:2013-03-11 02:58:02

标签: java serialization tcp objectoutputstream objectinputstream

我已经序列化了一些对象,因此我可以将它们转换为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();
    }

这些都取自Server程序,但序列化的代码在服务器和客户端之间是相同的;我非常重视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);
手反序列化方法中的

我知道它告诉我标题无效。我不确定如何解决它,因为它只是朝着一个方向而且代码是相同的。建议?

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

1 个答案:

答案 0 :(得分:1)

  

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

是的,你是。您正在为每个对象初始化一个新的ObjectOutputStream,然后您给自己额外的问题,即知道要接收每个对象要读取多少字节,并且您得到了错误,因此您将失去同步

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