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

时间:2009-06-21 02:35:22

标签: java linux sockets nonblocking

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

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

我已经研究过客户端线程是否被饿死(而不是发送数据),但是我正在向客户端线程屈服,它遍历所有套接字并写出数据。交通似乎在不断流动,但过了一段时间它才会消失。什么可能导致这种行为?

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

附加: 问题是处理Linux而不是我的代码。当我在Windows机器上运行完全相同的设置(在相同的硬件上)它永远不会超时,但几个小时后它们开始在Linux上发生。它必须是Linux中某种导致它发生的TCP设置。谢谢你的建议。

3 个答案:

答案 0 :(得分:1)

问题在于处理Linux而不是我的代码。当我在Windows机器上运行完全相同的设置(在相同的硬件上)它永远不会超时,但几个小时后它们开始在Linux上发生。它必须是Linux中某种导致它发生的TCP设置。谢谢你的建议。

答案 1 :(得分:0)

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

当在另一个线程具有未完成读取调用的套接字上调用close()时,close()默认会阻塞套接字直到读取调用完成。

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

如果没有看到代码,我不知道这是否是您问题的根本原因,但我想我会在此处添加此内容,因为它会影响您的问题。

答案 2 :(得分:0)

因此,在有效的情况下(带有最新JVM的Windows)和不带有最新JVM的Linux(带有最新JVM的Linux),服务器和客户端都在同一个JVM中的同一台机器上?

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

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