5

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

当前实施

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

从这个主线程产生的线程也包含一个ServerSocket并被用作一次处理多个连接的一种方式。

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

我的问题

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

附录

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

4

4 回答 4

6

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

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

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

于 2012-11-04T16:02:12.067 回答
3

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

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

基本决策完成后,我们可以选择合适的库和框架。从头开始做所有事情更有趣,但是会花费很多时间,以至于在完成的那一刻结果可能对任何人都不感兴趣。

于 2012-11-04T17:18:32.010 回答
1

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

还是我应该简单地在所有可用端口上打开 ServerSocket 并不断收听?

我更喜欢serversocket的池。

于 2012-11-04T15:59:34.243 回答
1

使用JMS(在我的例子中是它的 ActiveMq)实现你的目标。您可以轻松进行负载平衡和故障转移

于 2012-11-04T16:07:17.000 回答