在Java对象序列化中,您需要在服务器端和客户端中都在ObjectOutputStream
之前创建ObjectInputStream
,但是我要运行客户端,直到客户端等待为止从服务器获取数据(打印消息“ Done 1”,然后等待),在服务器端,代码仅运行直到到达从客户端读取第一件事为止(打印“ Done 1”,然后等待) 。
除了在ObjectOutputStream
之前创建ObjectInputStream
之外,我还需要做什么?在我看到的所有搜索中,他们都提到了对象创建的顺序,并且在一种情况下,他们说要在创建对象后立即刷新输出(例如Example1),但这也不起作用。>
Example1
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()
(为{{ 1}}和String
),在服务器端和客户端,问题都消失了。但是我不明白为什么会是这种情况,对此行为是否有解释以及解决方法?我会使用int
,但是我也需要发送/获取对象,所以DataOuput/InputStream
不会帮我。