gpt4 book ai didi

Socket 上的 Java ObjectOutputStream 未刷新()

转载 作者:搜寻专家 更新时间:2023-10-31 19:41:45 27 4
gpt4 key购买 nike

我正在开发一个用 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
}
}

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

谢谢!

更新:

我对此进行了更多的探查,它似乎只在系统资源被某些东西占用时才会发生。我无法在 VirtualBox 之外复制它,但这可能只是因为 VirtualBox 没有很多资源可以开始。我会在进一步调查时更新这个问题。

最佳答案

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

关于Socket 上的 Java ObjectOutputStream 未刷新(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4829761/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com