Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 套接字和ObjectInputStreams_Java - Fatal编程技术网

Java 套接字和ObjectInputStreams

Java 套接字和ObjectInputStreams,java,Java,我在两台不同的机器上运行了两个应用程序,它们通过Javas套接字实现发送可序列化的“Message”对象进行通信。每个服务器创建一个SocketServer,连接到其他服务器,然后连接以下内容(为了简洁起见,省略了伪Java、错误和连接详细信息): 接收代码: while (true) { Object received = oisFromOtherMachine.readUnshared(); dispatch(received); } 发送代码: synchronized

我在两台不同的机器上运行了两个应用程序,它们通过Javas套接字实现发送可序列化的“Message”对象进行通信。每个服务器创建一个SocketServer,连接到其他服务器,然后连接以下内容(为了简洁起见,省略了伪Java、错误和连接详细信息):

接收代码:

while (true) {
    Object received = oisFromOtherMachine.readUnshared();
    dispatch(received);
}
发送代码:

synchronized void sendMessage(Message m) {
    oosToOtherMachine.writeObject(m);
    oosToOtherMachine.flush();
    oosToOtherMachine.reset();
}
它是从各种不同的线程中定期调用的

直到大约3周前,这一切都很顺利,有时,为了响应特定的用户输入,对readUnshared的调用会抛出。到目前为止,我们已经看到了“java.lang.IllegalStateException:未读块数据”和“java.lang.ClassCast” 例外情况:java.util.HashMap不能强制转换为java.io.ObjectStreamClass”,这两种转换都是从ObjectInputStream内部深处进行的


这种情况大约每5分钟发生一次,通常是在两个系统启动并相互交谈15分钟以上之后。出于各种原因,我们有两条网线经常在这两条网线之间使用,一条是15米长的打结网线(ping为30毫秒以上),另一条是1米左右的网线(ping为从未出现过这种情况,我使用的Sockets+ObjectStreams相当多

我建议您尝试更新的JVM版本,核心类库内部的非法状态异常闻起来很奇怪。它只发生在一个非常快速的连接上这一事实几乎让它听起来像一个竞争条件


也许这次您确实“在GCC中发现了一个bug”

我的猜测是:这两台机器之间存在一些数据损坏;或者它们运行在不同的java版本上;对象图中存在一些棘手的单例;发送方端的reset()出错了


为什么要使用readUnshared()?

在我看来,网络数据似乎已损坏

可能是短电缆损坏了吗?您是否尝试过使用不同的短电缆 有线电视


另一种可能是网卡或驱动程序有故障。

我的随机猜测:虽然
发送消息
标记为
已同步
,但每个流都有多个对象实例。或者,每个
套接字
输出流
都有多个
ObjectOutputStream
e你看到GCC涉及到了吗?公平的问题。这或多或少是一个模糊的引用,指的是那些认为自己总是正确的程序员,他们认为应该归咎于其他东西——操作系统、编译器、硬件。啊,我明白了。然而,习惯于基础设施(操作系统、编译器、硬件)“只是工作”同样愚蠢(在我的经验中也是如此)你不再考虑它可能被破坏的可能性。举个例子:到目前为止,我在一个项目中已经两次遇到JVM崩溃。两次,结果都是一台RAM有故障的机器。MHarris:你能分享一下哪一次猜测最终获胜吗?
try {/* message loop */ } catch (RuntimeException) { /* resync appstate and continue*/ }