【发布时间】:2013-06-08 01:35:17
【问题描述】:
我正在开发一款通用的回合制游戏,目前它的运作方式如下: 使用 boneCP(连接池)、MySQL 数据库、java 服务器、android 客户端,以及即将推出的线程池。
客户端向服务器发出请求。 Java 服务器生成一个新线程来处理请求。 服务器发送响应。 TCP 套接字终止。
每个客户端不是维护大量持久(持久)连接,而是每隔 (x) 间隔简单地戳一下服务器,并询问是否轮到他们了。如果不是,它什么也不做。如果是,它可以输入并将其发送到服务器。
通过这种类型的服务器驱动网络,我是否会发现将所有东西都转换为 NIO 会带来一些好处?客户端通常只通过 TCP 套接字发送非常小的数据,几行文本。服务器很少偶尔会向客户端发送较大的文件(图像、声音、视频)。关于在此应用程序中使用 IO/NIO 的任何其他想法?我想知道这是否可以通过消除创建的最大线程数的瓶颈来扩展我的可扩展性,即使它们只持续一秒钟左右。
编辑:另请注意:如果玩家 A 等待超过 30-60 秒才能轮到他们,那么他们的回合将被放弃。所以这并不是说我可能永远在无限循环中戳服务器。充其量是5秒的间隔几次。在游戏没收之前有多少回合没收是有上限的。
【问题讨论】:
-
如果您需要限制并发,请使用线程池而不是为每个请求生成一个线程(请参阅 ExecutorService)。我看不出在您的用例中使用 NIO 有什么好处(大多数连接都是短暂的)。但是,我会考虑使用其他服务和网络优先级来处理这些大文件
-
服务器不能使用连接池。只有客户端可以使用连接池。您关于“不维护大量持久连接”的陈述与您关于连接池的断言相矛盾。您的实际问题仍然模糊不清,
-
我的服务器实现了一个连接池,我的意思是持久的,而不是两个玩家保持与服务器的连接直到他们的游戏结束,他们发送简短的请求以获得即时响应然后结束连接/线程
-
如果你的服务器实现了一个连接池,它是指向你这里还没有提到的一些其他资源,比如一个数据库。它没有实现到客户端的连接池,这是您迄今为止唯一提到的。可能您的意思是与客户端的连接的collection。这不是一回事。
-
我在 java 服务器上使用 BoneCP,它为每个连接生成一个新线程(很快在线程池中),其中一些最终会进行 MySQL 交互。
标签: java multithreading io connection-pooling nio