我正在研究用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在用户级别缓冲消息.