Socket上的Java ObjectOutputStream不是flush()ing

我正在研究用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)...

接收器:

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

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

谢谢!

更新:

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

解决方法:

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

上一篇:java – 从随机访问文件中读取对象


下一篇:Java 序列化和反序列化(二)Serializable 源码分析 - 1