Java 目标输出流挂起
我的“Socket到ServerSocket”实现的客户端看起来是这样的,但它从未通过Java 目标输出流挂起,java,sockets,Java,Sockets,我的“Socket到ServerSocket”实现的客户端看起来是这样的,但它从未通过ObjectInputStream-初始化。我试着注释掉这一行,然后执行下面的print语句。连接(至少最初)成功,ServerSocket报告连接成功 客户端 try( Socket socket = new Socket("localhost", 4444); ObjectOutputStream out = new ObjectOutputStream(socket.getOutputSt
ObjectInputStream
-初始化。我试着注释掉这一行,然后执行下面的print语句。连接(至少最初)成功,ServerSocket报告连接成功
客户端
try(
Socket socket = new Socket("localhost", 4444);
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
) {
System.out.println("Connection and IO established");
} catch (IOException e) {
e.printStackTrace();
}
服务器
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("Client has connected!"); // This always prints
new Thread(new ServerThread(clientSocket)).start();
System.out.println("ServerThread has started"); // This as well
}
ObjectInputStream阻止等待对等方的ObjectOutputStream的构造。显然,对等方没有构造一个,或者如果堆栈中有BufferedOutputStream,则可能需要在构造后立即刷新它
或者,由于您的客户端没有构造
ObjectOutputStream,因此它本身就挂起了构建ObjectInputStream的挂起。
解决方案是始终在ObjectInputStream之前构造并刷新ObjectOutputStream。
您是否将服务器端套接字流包装进去了对象流?文档中说它还等待Java实例头的序列化。此外,我们无法知道ObjectOutputStream是否由服务器打开,因为我们没有ServerThread的源代码。@robermann文档还说头是由ObjectOutputStream的构造函数编写的。我们当然可以知道头球还没有到。因此,要么它没有被刷新,要么ObjectOutputStream根本没有被构造。量化宽松