2015-03-06 6 views
3

У меня есть клиент-серверное приложение. Когда клиент отправляет объект, а сервер отправляет тот же объект обратно, простой сервер эхо-сигналов. Код ниже работает отлично, если я делаю новый экземпляр Client для каждого нового запроса. Однако, если я использую существующий экземпляр клиента, он дает мне java.io.StreamCorruptedException и java.lang.ClassCastException.Повторное использование ObjectInputStream throws StreamCorruptedException

Client

Socket socket = new Socket(hostName, port); 


in = new ObjectInputStream(
      new BufferedInputStream(socket.getInputStream())); 
out = new ObjectOutputStream(socket.getOutputStream()); 

//calling this each time I have a new request 
out.writeObject(request); 
out.flush(); 
Object object = in.readObject(); 

Сервер

ServerSocket serverSocket = new ServerSocket(port); 
Socket clientSocket = serverSocket.accept(); 
new Thread(new ClientWorker(clientSocket)).start(); 

ClientWorker

public void run() { 
     try { 
      ObjectOutputStream out = 
        new  ObjectOutputStream(clientSocket.getOutputStream()); 

      ObjectInputStream in = new ObjectInputStream(
        new BufferedInputStream(clientSocket.getInputStream())); 

      Object inputObject; 

     while(true) { 
      while ((inputObject = in.readObject()) != null) { 
        out.writeObject(inputObject); 
      } 

      out.flush(); 
     } 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
    } 
} 

EDIT:

, когда выполняется следующий код в повторно используемой Клиентом

in.readObject();

я получаю исключение

java.io.StreamCorruptedException: неверный тип кода: 00 в java.io.ObjectInputStream.readClassDesc (ObjectInputStream.java:1497) на java.io.ObjectInputStream. readOrdinaryObject (ObjectInputStream.java:1748) на java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1327) на java.io.ObjectInputStream.readObject (ObjectInputStream.java:349)

+1

потоки объектов хитры. Вы не можете просто повторно использовать их так, потому что все виды информации заголовка отправляются, помимо самих объектов. – Kayaman

+0

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

+0

@bot Я указал их – user592748

ответ

0

Проблема была решена после синхронизации по потокам входных и выходных объектов.

synchronized(this) { 
    while ((inputObject = in.readObject()) != null) { 
     out.writeObject(inputObject); 
    } 
} 

И

synchronized(this) { 
    out.writeObject(request); 
    out.flush(); 
    Object object = in.readObject(); 
}