2010-01-31 7 views
1

Я создаю клиент-серверное приложение. Теперь я хочу, чтобы переслать сообщение от клиента ко всему другому клиенту с этим кодом:Неверный заголовок потока Java: 7371007E

ArrayList<User> usrs = _usrHandler.getUsers(); 
for(User usr : usrs) { 
    if(!usr.getSocket().equals(_connection)) { 
     usr._oOut.writeObject(new CommunicationMessage(this._comMsg.getMessage(), CommunicationMessage.MSG, 
                this._comMsg.getUser())); 
} 
} 

На стороне клиента программы прослушивания сообщений. Он бросает это исключение:

java.io.StreamCorruptedException: invalid stream header: 7371007E 
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783) 
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280) 
    at Connection$MessageListener.run(Connection.java:126) 
    at java.lang.Thread.run(Thread.java:637) 

MessageListener:

   while(this._loop) { 
this._comMsg = (CommunicationMessage) this._dataInput.readObject(); 

SimpleAttributeSet attr = new SimpleAttributeSet(); 
attr.addAttribute(StyleConstants.CharacterConstants.Bold, Boolean.TRUE); 
attr.addAttribute(StyleConstants.CharacterConstants.Foreground, _comMsg.getUser().getColor()); 

messageClient.addMessage(_comMsg.getUser().getNickName() + ": ", attr); 
messageClient.addMessage(_comMsg.getMessage(), _comMsg.getUser().getColor()); 

_comMsg = null; 
} 

кто-то видит ли ошибка?

ответ

5

Вероятно, у вас есть ваши потоки.

При построении ObjectInputStream конструктор считывает первые два байта из потока, ожидая, что они будут «магическими значениями», которые должны присутствовать в потоке объектов. Если их там нет, он выбрасывает StreamCorruptedException (все это в исходном коде ObjectInputStream).

Похоже, что вы обертываете InputStream в ObjectInputStream, когда на самом деле данные, поступающие с другого конца соединения, на самом деле не являются потоком объектов. Возможно, он по-прежнему отправляет данные из предыдущего сообщения.

+2

Теперь я вижу свою ошибку. Я изменил способ построения потока слушателей, но не понял, что 'InputStream' все еще был построен в методе run(). Благодаря! – dododedodonl

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