有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Javasocket的两端齐平

我们有一组用Java编写的应用程序,它们通过socket交换短XML消息来相互通信。目前,在开发过程中,我们在同一工作站上运行所有应用程序。我们的问题是,在每个方向上交换了几万条消息之后,这些程序之间的socket连接可能会挂起

查看Eclipse调试器中的问题,我们发现连接的两端都在运行相同代码的独立实例。两端刚刚使用其write(String)调用基于socket成功地将有效消息写入BufferedWriter,并且两端似乎都在等待BufferedWriter flush()调用完成时被阻塞。代码没有什么不寻常的地方,在挂起之前,它可以完美地运行数千条消息。两端都没有抛出异常,等待似乎是不确定的。我们在Linux和Windows平台上运行时都发现了这个问题

有人能提出可能发生的事情吗


共 (4) 个答案

  1. # 1 楼答案

    仔细检查您的消息协议,确保socketA写入时,socketB读取,反之亦然。如果出现两端同时尝试写入的情况,则表明存在问题。最常见的情况是,发起连接(客户端)向接受端(服务器)写入消息。然后服务器会写一个响应,而客户机有望监听

  2. # 2 楼答案

    在java中实现高效的双向交换套接字编程make put reader&;作者是另一条线索

    在双向通信中实现套接字编程的最佳方法是什么

  3. # 3 楼答案

    Both ends have just successfully written a valid message to a BufferedWriter based on the Socket, using its write(String) call, and both ends appear to be blocked waiting on completion of a BufferedWriter flush() call.

    换句话说,两端都是写作,没有一端是阅读。因此,如果写入溢出了发送方的套接字发送缓冲区(如果接收方的套接字接收缓冲区已满,则可能发生这种情况),如果接收方未读取,则可能发生这种情况,发送方将阻塞。这听起来像是应用程序协议错误。当一端在发送时,另一端应该在接收。否则,在一端或两端应该有单独的发送和接收线程

  4. # 4 楼答案

    谢谢大家的想法。我们已经弄明白了,一旦我们有足够大的视野,它就一点也不神秘了。EJP走上了正确的道路。为了向您提供更多信息,每个应用程序打开的每个套接字实际上都有一个读取线程参与,该线程在消息可用时读取套接字,并将其放置在队列中以供进一步处理。这些读取线程在死锁的套接字两端等待读取,这就是昨天让事情变得如此令人费解的原因。 今天,在仔细观察之后,整个系统似乎都得到了备份;正在讨论的特定套接字在尝试将新读的消息排队时没有被阻止,但系统中的其他套接字被阻止。因为所有的应用程序都使用相同的代码进行通信,这种“刚性”能够锁定整个系统
    我们现在认识到发生了什么,以及如何修复它。再次感谢