【发布时间】:2011-06-17 07:36:29
【问题描述】:
我正在开发一个用 Java 编写的网络应用程序,使用 Sockets 之上的 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
}
}
有时消息正常,但有时我得到标记的异常而不是对象。冲洗不应该强制消息传递到另一边吗?我是否以某种方式错误地使用了该功能?或者这是底层 Java/OS 网络代码中的某种错误?
谢谢!
更新:
我对此做了更多的窥探,它似乎只在系统资源被某些东西征税时才会发生。我无法在 VirtualBox 之外复制它,但这可能只是因为 VirtualBox 没有很多资源。当我进一步研究这个问题时,我会不断更新这个问题。
【问题讨论】:
-
我无法复制问题。更多细节?
-
您能显示更多您的接收方代码吗?您是否尝试通过同一个套接字发送/接收多个消息(在这种情况下您不应该关闭流)。
-
在接收端重置连接时,发送端是否会抛出异常?
-
操作系统是 Red Hat Linux,在 Windows XP 之上的 VirtualBox 中运行。我确实通过同一个套接字发送和接收多条消息;这只发生在发送者关闭()它的流时,所以我去掉了其他消息代码。当它发生时,发送方没有例外。
-
哦,是的,我正在使用 jdk1.6.0_23。
标签: java sockets flush objectoutputstream