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

Squ*_*gem 5 java sockets serversocket

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

目前的实施

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

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

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

我的问题

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

附录

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

JB *_*zet 6

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

此外,您应该使用线程池,而不是为每个客户端启动新线程.这样可以避免不断创建新线程,并避免启动过多线程并使服务器陷入困境.

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

  • 该教程说:*accept方法等待客户端启动并请求此服务器的主机和端口上的连接.请求并成功建立连接时,accept方法返回一个新的Socket对象,该对象绑定到同一本地端口,并将其远程地址和远程端口设置为客户端的端口.服务器可以通过这个新的Socket与客户端通信,并继续监听原始ServerSocket上的客户端连接请求.*这是正常的做事方式.例如,Web服务器处理端口80上的许多并发请求. (2认同)