Socket上的Java ObjectOutputStream不是flush()ing

5 java sockets flush objectoutputstream

我正在研究用Java编写的网络应用程序,在套接字上使用ObjectOutputStream和ObjectInputStream来交换消息.我的代码看起来像这样:

发件人:

ObjectOutputStream out;
ObjectInputStream in;
try{
     Socket socket=new Socket(address, port);
     socket.setSoLinger(true, socketLingerTime);
     out=new ObjectOutputStream(socket.getOutputStream());
     out.writeObject(message);
     out.flush();
     out.close();
}catch (variousExceptions)...
Run Code Online (Sandbox Code Playgroud)

接收器:

Object incoming;
try{
    incoming=myObjectInputStream.readObject();
}catch (SocketException socketError)
{
    if (socketError.getMessage().equals("Connection reset"))
    {
        //this is the exception I get
    }
}
Run Code Online (Sandbox Code Playgroud)

有时消息会通过ok,但有时我会得到标记的异常而不是对象.是不是应该强制将消息强制传递给另一方?我以某种方式错误地使用该功能?或者这是底层Java/OS网络代码中的某种错误?

谢谢!

更新:

我已经对此做了更多的窥探,似乎只有当系统的资源被某些东西征税时才会发生.我无法在VirtualBox之外复制它,但这可能只是因为VirtualBox没有很多资源可以开始.当我进一步研究它时,我会更新这个问题.

小智 7

原来这个问题是由Nagle算法引起的; 输出缓冲区在OS中,因此它不受flush的影响.解决方案是使用Socket.setTcpNoDelay(true)关闭Nagle的算法,并使用BufferedOutputStream在用户级别缓冲消息.