Я сериализовал некоторые объекты, поэтому я могу преобразовать их в массивы байтов для TCP-пакета. Когда я отправляю объекты из серверной программы в клиентскую программу, проблем нет, и она работает нормально. Однако, хотя код между сервером и клиентом идентичен, когда я пытаюсь отправить объекты с клиента на сервер, я получаю недопустимый заголовок.Недопустимый заголовок потока 434B0005 от клиента к серверу
Вот объекты я сериализация:
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 от сервера к клиенту, чтобы убедиться, что таких ошибок не произойдет.
Сервер может конвертировать карту или руку в байт [] и записывать ее через DataOutputStream клиенту, а клиент может получать карту или руку через DataInputStream, десериализовать ее и читать без проблем , Когда я пытаюсь послать открытку или руку от клиента к серверу, однако, очень редко это работает и, как правило, я получаю
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);
в методе десериализации руки.
Я понимаю, что это говорит мне, что заголовок недействителен. Я не уверен, как это исправить, потому что он только ломается в одном направлении, а код идентичен. Предложения?
Я только отправляю одиночный объект за раз, поэтому я не инициализирую несколько ObjectInputStreams или что-то еще.
Я отрегулирую код, чтобы отразить ваше предложение, и посмотреть, работает ли это. Можете ли вы пояснить, почему именно он только ломается в одном направлении? Вы указали, что я получаю количество байтов, которые мне нужно читать неправильно, и это как-то меня выводит из строя; что могло бы привести к тому, что, если это можно получить из кода, который я опубликовал? –
Выход из синхронизации как-то является единственным логическим объяснением проблемы. Я не знаю, что вы подразумеваете под «движением в одну сторону», но код не должен иметь 100% -ный показатель неудачи. – EJP