我已经序列化了一些对象,因此我可以将它们转换为 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 或任何东西。