java.io. StreamCorruptedException: недопустимый потоковый заголовок: 7371007E

У меня есть клиент-серверное приложение, которые передают объекты использования.
когда я отправляю только один объект от клиента к серверу все работы хорошо.
когда я пытаюсь отправить несколько объектов один за другим на том же потоке, я добираюсь

StreamCorruptedException.  

Действительно ли кто-то может направить меня к причине этой ошибки?

клиентский метод записи

   private SecMessage[] send(SecMessage[] msgs) 
   {
     SecMessage result[]=new SecMessage[msgs.length];
      Socket s=null;
      ObjectOutputStream objOut =null;
      ObjectInputStream objIn=null;
      try
      {
       s=new Socket("localhost",12345);
       objOut=new ObjectOutputStream( s.getOutputStream());
       for (SecMessage msg : msgs) 
       {
            objOut.writeObject(msg);
       }
       objOut.flush();
       objIn=new ObjectInputStream(s.getInputStream());
       for (int i=0;i<result.length;i++)
            result[i]=(SecMessage)objIn.readObject();
      }
      catch(java.io.IOException e)
      {
       alert(IO_ERROR_MSG+"\n"+e.getMessage());
      } 
      catch (ClassNotFoundException e) 
      {
       alert(INTERNAL_ERROR+"\n"+e.getMessage());
      }
      finally
      {
       try {objIn.close();} catch (IOException e) {}
       try {objOut.close();} catch (IOException e) {}
      }
      return result;
 }

сервер прочитал метод

//in is an inputStream Defined in the server
SecMessage rcvdMsgObj;
rcvdMsgObj=(SecMessage)new ObjectInputStream(in).readObject();
return rcvdMsgObj;

и Класс SecMessage

public class SecMessage implements java.io.Serializable
{
 private static final long serialVersionUID = 3940341617988134707L;
 private String cmd;
    //... nothing interesting here , just a bunch of fields , getter and setters
}
20
задан Drew Noakes 20 May 2012 в 11:03
поделиться

2 ответа

Если вы отправляете несколько объектов, часто проще всего поместить их в какой-нибудь держатель/коллекцию, например Object[] или List. Это избавит вас от необходимости явно проверять конец потока и позаботится о явной передаче количества объектов в потоке.

EDIT: Теперь, когда я отформатировал код, я вижу, что у вас уже есть сообщения в массиве. Просто запишите массив в объектный поток и прочитайте его на стороне сервера.

Ваш "метод чтения на сервере" читает только один объект. Если его вызвать несколько раз, вы получите ошибку, поскольку он пытается открыть несколько объектных потоков из одного и того же входного потока. Это не сработает, поскольку все объекты были записаны в один и тот же поток объектов на стороне клиента, поэтому вы должны зеркально отразить эту схему на стороне сервера. То есть, используйте один поток ввода объектов и считывайте из него несколько объектов.

(Ошибка, которую вы получаете, связана с тем, что objectOutputStream пишет заголовок, который ожидается objectIutputStream. Поскольку вы записываете не несколько потоков, а просто несколько объектов, то следующий objectInputStream, созданный на входе сокета, не может найти второй заголовок и выбрасывает исключение.)

Чтобы исправить это, создайте objectInputStream, когда вы принимаете соединение сокета. Передайте этот objectInputStream в метод read вашего сервера и прочитайте из него Object.

10
ответ дан 30 November 2019 в 01:31
поделиться

когда я отправляю только один объект с клиента на сервер, все работает хорошо.

когда я пытаюсь отправить несколько объектов один за другим в одном потоке, я получаю StreamCorruptedException.

На самом деле, ваш клиентский код пишет один объект на сервер и читает несколько объектов с сервера. И нет ничего на стороне сервера, что записывает объекты, которые клиент пытается прочитать.

2
ответ дан 30 November 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: