问题是您创建流的顺序:
在文章中的服务器(我假设您正在使用的服务器)中,当打开新连接时,服务器首先打开一个输入流,然后打开一个输出流:
public Connect(Socket clientSocket) {
client = clientSocket;
try {
ois = new ObjectInputStream(client.getInputStream());
oos = new ObjectOutputStream(client.getOutputStream());
} catch(Exception e1) {
// ...
}
this.start();
}
注释的示例代码使用相反的顺序,首先建立输出流,然后是输入流:
// open a socket connection
socket = new Socket("localhost", 2000);
// open I/O streams for objects
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
但是您的代码以相反的方式执行此操作:
server = new Socket(host, port);
in = new ObjectInputStream(server.getInputStream());
out = new ObjectOutputStream(server.getOutputStream());
建立输出流/输入流对将停止,直到它们交换了握手信息,因此您必须匹配创建顺序。您可以通过在示例代码中交换第 34 行和第 35 行来做到这一点。