Java 目标输出流挂起

Java 目标输出流挂起,java,sockets,Java,Sockets,我的“Socket到ServerSocket”实现的客户端看起来是这样的,但它从未通过ObjectInputStream-初始化。我试着注释掉这一行,然后执行下面的print语句。连接(至少最初)成功,ServerSocket报告连接成功 客户端 try( Socket socket = new Socket("localhost", 4444); ObjectOutputStream out = new ObjectOutputStream(socket.getOutputSt

我的“Socket到ServerSocket”实现的客户端看起来是这样的,但它从未通过
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根本没有被构造。量化宽松