Подтвердить что ты не робот

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
}
4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

Это исключение может также возникать, если вы используете Socket с одной стороны и SSLSocket с другой. Согласованность важна.