-3

我正在开发一个通用的回合制游戏,目前它是这样操作的:使用 boneCP(连接池)、MySQL 数据库、java 服务器、android 客户端,以及很快的线程池。

客户端向服务器发出请求。Java 服务器生成一个新线程来处理请求。服务器发送响应。TCP 套接字终止。

每个客户端不是维护大量持久(持久)连接,而是每隔 (x) 间隔简单地戳一下服务器,并询问是否轮到他们了。如果不是,它什么也不做。如果是,它可以输入并将其发送到服务器。

使用这种类型的服务器驱动网络,我是否会发现将所有东西都转换为 NIO 会有一些好处?客户端通常只通过 TCP 套接字发送非常小的数据,几行文本。服务器很少偶尔会向客户端发送较大的文件(图像、声音、视频)。关于在此应用程序中使用 IO/NIO 的任何其他想法?我想知道这是否可以通过消除创建的最大线程数的瓶颈来扩展我的可伸缩性,即使它们只持续一秒钟左右。

编辑:另请注意:如果玩家 A 等待超过 30-60 秒才能轮到他们,那么他们的回合将被放弃。所以这并不是说我可能永远在无限循环中戳服务器。充其量是5秒的间隔几次。在游戏没收之前有多少回合没收是有上限的。

4

2 回答 2

2

我建议使用基于事件的方法而不是这种同步方法。

您可以在更高效和可扩展的事件循环中检查客户端,而不是在 while 循环中检查客户端数千次。

于 2013-06-08T09:08:46.857 回答
1

为了避免最大线程瓶颈,您可以使用线程池。您可以通过使用 NIO 2 异步 IO 类来做到这一点。

class ConnectionConext {}

class Handler implements CompletionHandler<Integer,ConnectionConext > {
public void completed(Integer result, ConnectionConext conn) {
// handle result
}
public void failed(Throwable exc, ConnectionConext conn) {
// error handling
}
}

//using executor's thread pool
ExecutorService executor = ...
//consider other withFixedThreadPool, or withCachedThreadPool
AsynchronousChannelGroup group = AsynchronousChannelGroup
.withThreadPool(executor);

AsynchronousSocketChannel channel =
AsynchronousSocketChannel.open(group);

ByteBuffer buf = ByteBuffer.allocate(...);//consider to use ByteBuffer pool for better scalability
ConnectionConext conn = ..//some connection info that will be passed to completion handler.
Handler handler = ...

ch.read(buf, conn, handler);

也考虑灰熊项目有用的东西。

于 2013-06-08T10:23:51.173 回答