2013-12-25 3 views
0

Я получаю это получить эту Exception:java.io.StreamCorruptedException: неверный заголовок потока: 00000001

стороны
java.io.StreamCorruptedException: invalid stream header: 00000001 

сервера я использовал это для отправки и получения Int, работает отлично.

Сервер:

new DataOutputStream(player1.getOutputStream()).writeInt(P1); 

Клиент:

dataFromServer = new DataInputStream(socket.getInputStream()); 
dataFromServer.readInt(); 

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

Сервер:

new ObjectOutputStream(player2.getOutputStream()).writeObject(gameCrossword); 

Клиент:

objectFromServer = new ObjectInputStream(socket.getInputStream()); 
crossword = (Crossword)objectFromServer.readObject(); 

Любая помощь будет хорошо. Вот я отправка кроссворд первоначально до игры сеансу

Я изменил код, чтобы использовать только объект потоков, а не потоки данных, по совету jtahlborn

сервер

player1 = serverSocket.accept(); 

serverLog.append(new Date() + ": Player 1 joined session " + sessionNo + '\n'); 
serverLog.append("Player 1's IP address" + player1.getInetAddress().getHostAddress() + '\n'); 

new ObjectOutputStream(player1.getOutputStream()).writeInt(P1); 
new ObjectOutputStream(player1.getOutputStream()).writeObject(gameCrossword); 

player2 = serverSocket.accept(); 

serverLog.append(new Date() + ": Player 2 joined session " + sessionNo + '\n'); 

serverLog.append("Player 2's IP address" + player2.getInetAddress().getHostAddress() + '\n'); 

new ObjectOutputStream(player2.getOutputStream()).writeInt(P2); 
new ObjectOutputStream(player2.getOutputStream()).writeObject(gameCrossword); 

клиент

   private void connectToServer() { 

    try { 
     Socket socket = new Socket(host, 8000); 
     objectFromServer = new ObjectInputStream(socket.getInputStream()); 
     objectToServer = new ObjectOutputStream(socket.getOutputStream()); 

    } catch (IOException ex) { 
     System.err.println(ex); 
    } 

    Thread thread = new Thread(this); 
    thread.start(); 
} 

@Override 
public void run() { 

    try { 
     player = objectFromServer.readInt(); 
     crossword = (Crossword)objectFromServer.readObject(); 
     System.out.println(crossword); 

С уважением, C.

+0

Вы забыли добавить дополнительный код поддержки. –

+0

Спасибо за этого приятеля – user3131312

+0

Вы читаете объект после того, как читаете int? –

ответ

3

не обматывают потоки сокетов несколькими потоками ввода/вывода. это нарушит всевозможные плохие пути. в этом конкретном случае ObjectInputStream считывает заголовок из потока по построению, который происходит до того, как вы прочитали int из потока. независимо, просто используйте один объект ObjectOutputStream и ObjectInputStream и потоки данных (обратите внимание, что ObjectOutputStream имеет метод writeInt).

+0

Я сделал это, theres no error больше, но они больше не подключаются. Я обновляю свой пост с кодом, который я пробовал – user3131312

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