0

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

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

谁能建议可能发生的事情?

4

4 回答 4

2

两端刚刚使用其 write(String) 调用成功地将有效消息写入基于 Socket 的 BufferedWriter,并且两端似乎都在等待 BufferedWriter flush() 调用完成时被阻塞。

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

于 2013-09-09T03:40:04.287 回答
0

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

于 2013-09-09T04:54:57.150 回答
0

谢谢大家的想法。我们已经弄清楚了,一旦我们采取了足够大的视野,它根本就不是真正的神秘。EJP 走在了正确的轨道上。为了提供更多信息,每个应用程序打开的每个套接字实际上都由一个读取线程参与,该线程在消息可用时读取套接字,并将这些放在队列中以供进一步处理。这些读取线程在死锁的套接字的两端都在等待读取,这就是昨天让事情看起来如此莫名其妙的原因。今天仔细一看,整个系统都备份了;有问题的特定套接字在尝试对新读取的消息进行排队时没有被阻塞,但系统中的其他套接字却被阻塞了。因为所有应用程序都使用相同的代码进行通信,所以这种“刚性”
我们现在认识到发生了什么,以及如何解决它。再次感谢。

于 2013-09-10T03:13:01.357 回答
-1

为了在 java 中进行高效的 2 路交换套接字编程,使读写器是不同的线程。

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

于 2013-09-09T04:36:01.637 回答