Java.io.StreamCorruptedException: недопустимый заголовок потока: 54657374
Я пытаюсь прочитать строку, которая отправляется клиентом с помощью программы Socket. Код выглядит следующим образом:
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.ClassNotFoundException;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServerExample {
//static ServerSocket variable
private static ServerSocket server;
//socket server port on which it will listen
private static int port = 5000;
public static void main(String args[]) throws IOException, ClassNotFoundException{
//create the socket server object
server = new ServerSocket(port);
//keep listens indefinitely until receives 'exit' call or program terminates
while(true){
System.out.println("Waiting for client request");
//creating socket and waiting for client connection
Socket socket = server.accept();
//read from socket to ObjectInputStream object
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
//convert ObjectInputStream object to String
String message = (String) ois.readObject();
System.out.println("Message Received: " + message);
//create ObjectOutputStream object
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
//write object to Socket
oos.writeObject("Hi Client "+message);
//close resources
ois.close();
oos.close();
socket.close();
//terminate the server if client sends exit request
if(message.equalsIgnoreCase("exit")) break;
}
System.out.println("Shutting down Socket server!!");
//close the ServerSocket object
server.close();
}
}
Но при чтении строки от клиента я получаю ошибку следующим образом:
Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 54657374
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:803)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298)
at SocketServerExample.main(SocketServerExample.java:29)
Я искал и не смог найти ошибку. Пожалуйста, помогите мне.
Ответы
Ответ 1
Очевидно, что вы не отправляете данные с помощью ObjectOutputStream:
, вы просто пишете байты.
- Если вы читаете с помощью
readObject()
, вы должны написать с помощью writeObject().
- Если вы читаете с помощью
readUTF()
, вы должны написать с помощью writeUTF().
- Если вы читаете с помощью
readXXX()
, вы должны написать с помощью writeXXX(),
для большинства значений XXX.
Ответ 2
Вы не можете ожидать, что ObjectInputStream
автоматически преобразует текст в объекты. Шестнадцатеричный 54657374
является "Test"
как текст. Вы должны отправлять его напрямую в виде байтов.