我怎么能快速知道服务器是否已连接?

时间:2011-05-05 18:39:33

标签: java performance sockets connection

我正在开发一个Java客户端/服务器应用程序,其中将有大量客户端将要连接的服务器。问题是,他们中的绝大多数可能不会同时服务。客户端需要在列表中找到至少一个可用的,因此它将迭代它,寻找可用的服务器(当它找到第一个它停止时,一个就足够了。)

问题是列表可能很长,数十万,甚至可能是数百......而且可能只有1%的列表连接(即执行服务器)。这就是为什么我需要一种聪明而快速的方法来了解服务器是否已连接,而无需等待超时等。我接受各种建议。

我考虑过以统计方式对服务器列表进行排序,以便更常用的服务器是第一个尝试的主机。但这还不够。

也许组播UDP数据报?客户端/服务器之间的连接是TCP,但是为了找到服务器,最好首先进行UDP组播并等待答案,例如......你怎么看?

:)

修改

服务器和客户端都使用线程池。

服务器池同时处理200个线程,当池已满时,将其余部分排队,直到队列长度为200个可运行的队列。然后它阻塞,并停止接受连接,直到队列中有空闲空间。

客户端有一个缓存的线程池,它可以同时向所需的服务器发出所有请求(具有常识,显然......)。

4 个答案:

答案 0 :(得分:2)

这只是一个初步的想法,并会增加一些头脑,但你可以让服务器定期ping一些客户端连接的集中式服务器。然后,如果服务器没有ping一段时间,它就会被删除。

答案 1 :(得分:1)

您可能希望使用点对点网络。

看看JXTA / JXSE: http://jxse.kenai.com/index.html

答案 2 :(得分:0)

如果您自己的代码在每个服务器上运行,您是否可以将活动发送到中央服务器(由您控制​​并保证始终处于运行状态)?然后,中央服务器可以维护所有活动服务器的更新列表。客户端只需要从中央服务器获取此列表的副本,然后启动它需要的任何通信。

答案 3 :(得分:0)

听起来像是Threads的工作。您无法加速连接,需要时间来联系服务器。

恕我直言,最好的方法是让几百个线程进入服务器列表。第一个找到一个服务器活着的人获胜。然后发信号通知其他线程消失。

顺便说一句,你真的是故意要“悲伤地”订购服务器列表吗? :)