0

Я сериализовал некоторые объекты, поэтому я могу преобразовать их в массивы байтов для 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 или что-то еще.

ответ

1

Я не инициализирую несколько объектов ObjectOutputStreams или что-то еще.

Да, вы есть. Вы инициализируете новый ObjectOutputStream для каждого объекта, а затем задаете себе дополнительную проблему, чтобы узнать, сколько байтов читать, чтобы получать каждый объект, и вы ошибаетесь, поэтому вы получаете не синхронизацию ,

Избавьтесь от всего этого. Вам это не нужно. Это просто добавление проблем. Просто используйте один объект ObjectOutputStream и ObjectInputStream напрямую для жизни сокета, созданного непосредственно над потоками сокетов, и вызовите writeObject(), когда вы хотите отправить объект, и readObject(), когда вы хотите его прочитать. Две строки кода. Забудьте о байтовых массивах и ByteArray/DataInput/OutputStreams вообще.

+0

Я отрегулирую код, чтобы отразить ваше предложение, и посмотреть, работает ли это. Можете ли вы пояснить, почему именно он только ломается в одном направлении? Вы указали, что я получаю количество байтов, которые мне нужно читать неправильно, и это как-то меня выводит из строя; что могло бы привести к тому, что, если это можно получить из кода, который я опубликовал? –

+0

Выход из синхронизации как-то является единственным логическим объяснением проблемы. Я не знаю, что вы подразумеваете под «движением в одну сторону», но код не должен иметь 100% -ный показатель неудачи. – EJP

Смежные вопросы