什么是用于创建多用户客户端 - 服务器应用程序的适当体系结构?

时间:2012-11-04 15:52:00

标签: java sockets serversocket

我正在开发一个需要单个服务器和大量客户端的应用程序。我正在使用Java套接字编程API来完成此任务。目前,我正在考虑重组我的应用程序的整个设计,因为我根本不认为它是以最有效的方式构建的,并且会欣赏一些指向最佳路径的指导。

当前实施

我在端口5000上有一个ServerSocket,包含套接字的线程只是连续运行并接受任何连接。然后它启动一个新的服务器线程(基于可用端口的同步表)来处理与该客户端的通信,然后再次阻塞ServerSocket.accept()

从此主线程生成的线程也包含ServerSocket,并用作一次处理多个连接的方法。

现在,客户端线程只是连接到端口5000,接收下一个可用端口作为回复,然后从端口5000断开连接(通过调用Socket.close()),并重新连接到服务器认为可用的端口。

我的问题

这是在单个服务器上处理多个客户端的最佳方式(或者更好,甚至更合理吗?)?或者我应该只是在所有可用端口上打开ServerSocket并且只是不断听?也许是我尚未考虑的事情?

附录

我正在考虑使用非常大的客户端 - 服务器应用程序(如MMORPG或某些聊天应用程序)来了解我的实现的可行性。例如,我试着问自己:“虽然这可能有用,如果这个应用程序拥有庞大的用户群,它会是一个很好的解决方案吗?”。话虽如此,如果我能够看到它如何大规模地工作,比如数百万用户,我将更容易理解解决方案的最佳性质。

4 个答案:

答案 0 :(得分:6)

我不明白为什么每次主要接受连接时都需要使用新的ServerSocket。为什么不简单地使用accept()返回的套接字(如Java tutorial中所述)?

此外,您应该使用线程池,而不是为每个客户端启动新线程。这样可以避免不断创建新线程,并避免启动太多线程并使服务器瘫痪。

但是,这种架构并不是处理大量用户的最佳架构。如果你真的需要这样的可扩展性,使用异步IO可能是一个更好的解决方案,但我没有太多经验。

答案 1 :(得分:3)

在考虑服务器架构时,第一个问题是估计单个连接需要多少内存和进动功率。第二个是同时连接的数量。乘法后,我们可以决定单机是否足够或我们需要一个集群。

然后我们决定是否可以为连接提供一个线程(大约128..512 KB)。如果可以,那么经典的单线程每个连接就可以了。如果我们不能,那么基于NIO或NIO2的异步架构更适合。

完成基本决策后,我们可以选择合适的库和框架。从头开始做一切都很有趣,但是花费很多时间,结果可能对目前没有人感兴趣。

答案 2 :(得分:1)

我同意您的以下建议,因为端口5000上的单个服务器是瓶颈:

  

或者我应该只在所有可用端口上打开ServerSocket   经常听?

我更喜欢serversocket池。

答案 3 :(得分:1)

使用JMS (in my case its ActiveMq)实现目标。您可以轻松实现负载平衡和故障转移