我们有一组用Java编写的应用程序,它们通过套接字交换简短的XML消息来相互通信。目前,在开发过程中,我们正在同一工作站上运行所有应用程序。我们的问题是,在每个方向交换了成千上万条消息之后,这些程序之间的套接字连接可能会挂起。
查看Eclipse调试器中的问题,我们发现连接的两端正在运行相同代码的单独实例。两端都刚刚使用其write(String)调用成功地将有效消息写入基于Socket的BufferedWriter中,并且两端似乎已阻塞,等待BufferedWriter flush()调用完成。该代码没有什么异常之处,它在挂起之前可以完美地运行数千条消息。两端均不会引发异常,并且等待似乎是不确定的。在Linux和Windows平台上运行时,我们已经观察到此问题。
谁能建议可能会发生什么?
最佳答案
两端都刚刚使用其write(String)调用成功地将有效消息写入基于Socket的BufferedWriter中,并且两端似乎已阻塞,等待BufferedWriter flush()调用完成。
换句话说,两端都在写,而一端没有在读。因此,如果写操作溢出了发送方的套接字发送缓冲区(如果接收方的套接字接收缓冲区已满,则可能发生这种情况,如果接收方没有读取,则可能发生),发送方将阻塞。这听起来像是应用程序协议错误。在一端正在发送时,另一端应该正在接收。否则在一端或两端应有单独的发送和接收线程。