代码之家  ›  专栏  ›  技术社区  ›  MHarris

套接字和对象输出流

  •  1
  • MHarris  · 技术社区  · 16 年前

    我在两台不同的机器上运行了两个应用程序,它们通过javas套接字实现发送可序列化的“消息”对象进行通信。每一个都创建一个Socket服务器,连接到其他服务器,然后为简洁(简洁)省去以下伪比特(错误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:Unread Block Data”和“java.lang.Classcast” 例外:JavaUTI.HASHMAP不能被映射到java. Io.ObjutStudio类,这两个对象都来自ObjutsPixStand的内部。

    大约每5次发生一次,通常在两个系统启动并相互交谈15分钟以上之后。由于各种原因,我们有两条经常在这两条电缆之间使用的网线,一条是15米(30毫秒以上),另一条大约1米(1毫秒以上)。它只在短电缆上发生过(相信我,我们已经多次尝试过长电缆)。

    我试过检查任何消息对象可以到达的所有内容是否都是可序列化的,在发送消息之前,日志中没有任何关于这两个应用程序的线索,并且没有得到错误的应用程序仍然愉快地继续运行,没有意识到任何问题。

    所以。谷歌在OIS、OOS或Java套接字中没有任何可能导致它的漏洞,而我的同事们和我一样难堪。以前有人见过这样的东西吗?

    编辑: 谢谢大家的建议。(-:总而言之,我怀疑对某些日志状态对象的某些不同步访问正在生成一个中断的对象图,这导致OIS阻塞。这需要解决昨天虽然,和同步关键字的自由应用连同以下憎恶…

    try {/* message loop */ } catch (RuntimeException) { /* resync appstate and continue*/ } 
    

    …将比更令人沮丧的(25分钟以上)尝试重现问题和相关的头颅挤压更快、更高的成功机会。

    4 回复  |  直到 16 年前
        1
  •  2
  •   akarnokd    16 年前

    我的猜测是:在两台机器之间有一些数据损坏;或者它们运行在不同的Java版本上;在对象图中有一些棘手的单体;发送方的ReSET()被弄乱了。

    为什么使用readUnshared()?

        2
  •  0
  •   Michael Borgwardt    16 年前

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

    可能只是短电缆损坏了吗?你试过用不同的短裤吗 电缆?

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

        3
  •  0
  •   Robert Munteanu    16 年前

    从来没有见过这样的情况,而且我正在大量使用sockets+objectstreams。

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

    也许这次你真的“在海湾合作委员会发现了一个漏洞”?

        4
  •  0
  •   Tom Hawtin - tackline    16 年前

    我的随机猜测:虽然 sendMessage 被标记 synchronized ,每个流都有多个对象实例。或者你有不止一个 ObjectOutputStream 对于每一个 Socket OutputStream .