Java 重用ObjectInputStream会引发StreamCorruptedException
我有一个客户机-服务器应用程序。客户机发送一个对象,服务器返回同一个对象,这是一个简单的echo服务器。如果我为每个新请求创建一个新的Java 重用ObjectInputStream会引发StreamCorruptedException,java,sockets,networking,inputstream,outputstream,Java,Sockets,Networking,Inputstream,Outputstream,我有一个客户机-服务器应用程序。客户机发送一个对象,服务器返回同一个对象,这是一个简单的echo服务器。如果我为每个新请求创建一个新的Client实例,下面的代码可以正常工作。但是,如果我使用客户机的现有实例,它会给我一个java.io.StreamCorruptedException和java.lang.ClassCastException 客户 Socket socket = new Socket(hostName, port); in = new ObjectInputStream(
Client
实例,下面的代码可以正常工作。但是,如果我使用客户机的现有实例,它会给我一个java.io.StreamCorruptedException
和java.lang.ClassCastException
客户
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();
客户工作者
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();
}
}
编辑:
在重用的客户端中执行以下代码时
.readObject()中的
我有个例外
java.io.StreamCorruptedException:类型代码无效:00 at
java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1497)
在
java.io.ObjectInputStream.ReadOrderinaryObject(ObjectInputStream.java:1748)
位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1327)
位于java.io.ObjectInputStream.readObject(ObjectInputStream.java:349)
在我对输入和输出对象流进行同步后,问题得到了解决
synchronized(this) {
while ((inputObject = in.readObject()) != null) {
out.writeObject(inputObject);
}
}
及
对象流很棘手。由于除了对象本身之外还发送了各种各样的头信息,所以不能像那样重用它们。我们是否签出了相应类的java文档,以及何时抛出此异常?你能指出发生这些异常的地方吗?我已经指出了out@Kayaman那么我需要做什么?@user592748我建议您在网络通信中根本不要使用ObjectStreams
,而是使用普通字节流。
synchronized(this) {
out.writeObject(request);
out.flush();
Object object = in.readObject();
}