在java对象序列化中,需要创建 ObjectOutputStream
之前 ObjectInputStream
在服务器端和客户机端,我都这么做了,但是客户机将一直运行,直到它必须等待来自服务器的数据(打印消息“done 3”,然后等待),而在服务器端,代码只运行,直到它从客户机读取第一件事(打印“done 1”,然后等待)。除了创建 ObjectOutputStream
之前 ObjectInputStream
? 从我看到的所有搜索中,他们都提到了对象创建的顺序,在一个例子中,他们说在创建输出后立即刷新输出(如示例1),但这也不起作用。
例1
ObjectOutputStream dataOut = new ObjectOutputStream(socket.getOutputStream());
dataOut.flush();
ObjectInputStream dataIn = new ObjectInputStream(socket.getInputStream());
服务器
@Override
public void run() {
try {
serverSocket = new ServerSocket(4554);
serverRunning = true;
while (serverRunning) {
socket = serverSocket.accept();
ObjectOutputStream dataOut = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream dataIn = new ObjectInputStream(socket.getInputStream());
System.out.println("Done 1");
String string = dataIn.readUTF();
System.out.println("Done 2");
int number = dataIn.readInt();
System.out.println("Done 3");
dataOut.writeUTF("String from server");
System.out.println("Done 4");
dataOut.writeInt(1);
System.out.println("Done 5");
System.out.println(string + " | " + number);
}
} catch (IOException e) {
e.printStackTrace();
}
}
客户
Socket socket = new Socket("localhost", 4554);
ObjectOutputStream dataOut = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream dataIn = new ObjectInputStream(socket.getInputStream());
System.out.println("Done 1");
dataOut.writeUTF("String from client");
System.out.println("Done 2");
dataOut.writeInt(2);
System.out.println("Done 3");
String string = dataIn.readUTF();
System.out.println("Done 4");
int number = dataIn.readInt();
System.out.println("Done 5");
socket.close();
System.out.println(string + " | " + number);
//编辑:所以,如果我改变
writeUTF() writeInt()
至 writeObject()
,每
readUTF() readInt()
至 readObject()
(为添加相应的强制转换) String
以及 int
)在服务器端和客户端,问题消失了。但我不明白为什么会出现这种情况,有没有对这种行为的解释和解决办法?我会用 DataOuput/InputStream
,但我也需要发送/获取对象,所以 DataOuput/InputStream
不会帮我的。
暂无答案!
目前还没有任何答案,快来回答吧!