У меня есть клиент-серверное приложение. Когда клиент отправляет объект, а сервер отправляет тот же объект обратно, простой сервер эхо-сигналов. Код ниже работает отлично, если я делаю новый экземпляр 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)
потоки объектов хитры. Вы не можете просто повторно использовать их так, потому что все виды информации заголовка отправляются, помимо самих объектов. – Kayaman
Вышла проверка оформления java-документов для соответствующих классов и когда это исключение выбрано? Можете ли вы указать линии, где происходят эти исключения. – CKing
@bot Я указал их – user592748