我有一个基于回合制的通用游戏,我正在研究它现在的运作方式: 使用boneCP(连接池),MySQL数据库,java服务器,android客户端,很快就成了一个线程池。
客户端向服务器发出请求。 Java服务器会发出一个新线程来处理请求。 服务器发送响应。 TCP套接字终止。
而不是维持持久(持久)连接的负载,而不是每个客户端简单地每隔(x)间隔戳一次服务器并询问它们是否轮到他们。如果不是,它什么都不做。如果是,它可以输入并将其发送到服务器。
使用这种类型的服务器驱动网络,我可以找到将所有内容转换为NIO的一些好处吗?客户端通常只发送非常小的数据,通过TCP套接字发送几行文本。服务器可能很少偶尔向客户端发送较大的文件(图像,声音,视频)。关于在这个应用中使用IO / NIO的其他想法?我想知道这是否可以通过消除创建的最大线程数的瓶颈来扩展我的可扩展性,即使它们仅持续大约一秒左右。
编辑:还要注意:如果玩家A等待超过30-60秒才能轮到他们,那么轮到他们就会被取消。所以,并不是说我可能永远在无限循环中戳服务器。最多只有5秒的间隔几次。在游戏没收之前,还有多少转折的上限。
答案 0 :(得分:2)
我建议使用基于事件的方法而不是这种同步方法。
您可以在事件循环中检查它,而不是在while循环中数千次检查客户端,而且事件循环更有效且可扩展。
答案 1 :(得分: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);
还要考虑Grizzly Project有用的东西。