Java Linux非阻塞套接字超时行为

Java Linux非阻塞套接字超时行为,java,linux,sockets,nonblocking,Java,Linux,Sockets,Nonblocking,我有一个Java非阻塞服务器,它跟踪选择器中的所有套接字通道。然后,我与服务器建立500个连接,并定期发送数据。服务器接收到的每一条数据都会回显到客户端 问题是,测试工作了几个小时,然后突然服务器管理的所有套接字在尝试读取数据时抛出连接超时IOException 我已经研究了客户机线程是否处于饥饿状态(并且没有发送数据),但我还是让客户机线程遍历所有套接字并写出数据。交通似乎一直在正常运转,但过了一段时间,一切都消失了。知道是什么导致了这种行为吗 我正在Linux平台上运行最新的Java6迭代。

我有一个Java非阻塞服务器,它跟踪选择器中的所有套接字通道。然后,我与服务器建立500个连接,并定期发送数据。服务器接收到的每一条数据都会回显到客户端

问题是,测试工作了几个小时,然后突然服务器管理的所有套接字在尝试读取数据时抛出连接超时IOException

我已经研究了客户机线程是否处于饥饿状态(并且没有发送数据),但我还是让客户机线程遍历所有套接字并写出数据。交通似乎一直在正常运转,但过了一段时间,一切都消失了。知道是什么导致了这种行为吗

我正在Linux平台上运行最新的Java6迭代。我的应用程序启动两个线程,一个用于服务器,一个用于所有客户端。提前谢谢

额外:
问题在于Linux,而不是我的代码。当我在Windows机器上运行完全相同的设置时(在相同的硬件上),它永远不会超时,但几个小时后,它们开始在Linux上出现。一定是Linux中的某种TCP设置导致了这种情况的发生。感谢您的建议。

Java和JRE版本1.5或5.0中的-doCloseWithReadPending选项允许一个线程在另一个线程的同一套接字上存在读取挂起时关闭套接字

当对具有来自另一个线程的未完成读取调用的套接字调用close()时,close()默认情况下会阻止套接字,直到读取调用完成

使用-doCloseWithReadPending选项,socket close()调用将关闭套接字,并且在具有挂起读取的线程上下文中,将抛出带有消息“socket closed”的SocketException


在没有看到代码的情况下,我不知道这是否是您的问题的根本原因,但我想我会在这里添加这一点,以防它影响您的问题。

问题涉及Linux,而不是我的代码。当我在Windows机器上运行完全相同的设置时(在相同的硬件上),它永远不会超时,但几个小时后,它们开始在Linux上出现。一定是Linux中的某种TCP设置导致了这种情况的发生。谢谢你的建议。

那么,在工作的情况下(Windows使用最新JVM)和不工作的情况下(Linux使用最新JVM),服务器和客户端都在同一台JVM中的同一台机器上

你能解释一下“突然逐渐”是什么意思吗?比如,在几个小时后——总是相同的小时数——然后在几秒钟内所有服务器端套接字都会抛出异常


您没有提到客户端线程读取返回的数据。也许它停了,你还没有注意到。(当服务器线程遇到500个快速异常时,客户端线程在做什么?连续尝试几个堆栈转储以查看。)

您有一些代码要向我们展示吗?还有
客户端和服务器上的
netstat-a的输出?有任何套接字处于不满意的状态吗?你能发布该IOException的ex.printStackTrace()的输出吗?我认为你需要按照noselasd的建议发布代码和详细的IOException堆栈跟踪来解决这个问题。你看到Chris和我的评论了吗?我们需要更多的信息来帮助。我已经将这些信息转移到了问题上——这可能不应该是一个答案。大约4-5个小时后,Linux客户端套接字开始超时并关闭(即使它们仍在发送数据)。当它启动时,每个客户机关闭时大约有四分之一秒的延迟。当我在一开始连接客户端时,连接之间的延迟为250ms,因此在相同的时间段内处于活动状态后,它们似乎都超时了。这很奇怪。这个问题在客户端上存在,因为服务器接收到一个-1,据我查看文档所知,这意味着客户端完全关闭了套接字。服务器将继续运行。我不会假设-1/EOF意味着完全关闭——只是读取流已经结束,不管出于什么原因。您的初始报告称服务器遇到异常;你现在是说它没有?如果你想解决这个问题,请回答每个人的其他问题。(1) 代码;(2) netstat的输出;(3) 确认两种情况下客户端和服务器是否在同一JVM中运行;(4) 工作期间和之后的堆栈转储(SIGQUIT/Ctrl中断)。实际的错误堆栈也会有帮助,您应该检查单个套接字是否存在相同的问题;SocketChannels和传统的InputStreams在数据末尾都返回-1,即使没有错误。我想这些链接是意外断开的:以下是我认为它们应该是的:以及