这是一个很好的多线程服务器设计吗?

时间:2011-04-13 23:16:21

标签: java multithreading networking client-server

我有一个服务器用于客户端 - 服务器游戏(理想情况下是小型MMO的基础),我正在尝试确定组织一切的最佳方式。以下是我的概述:

[server start]
load/create game state
start game loop on new thread
start listening for udp packets on new thread
while not closing
  listen for new tcp connection
    create new tcp client
    start clients tcp listener on new thread
save game state
exit

[game loop]
  sleep n milliseconds // Should I sleep here or not?
  update game state
  send relevant udp packet updates to client
  every second
    remove timed out clients

[listen for udp]
  on receive, send to correct tcp client to process

[listen for tcp] (1 for each client)
  manage tcp packets

这是一个公平的设计,用于管理游戏状态,TCP连接以及发送/接收udp数据包以进行状态更新吗?有任何意见或问题吗?

我最感兴趣的是玩游戏循环的最佳方式。我知道如果我有大量客户端会有问题,因为我为每个新客户端生成一个新线程。

3 个答案:

答案 0 :(得分:1)

这似乎是设计的合理开端。在扩展线程数量方面超越10个客户端(根据您的评论)并不坏。只要线程主要等待并且实际上没有处理某些东西,您就可以在事情开始崩溃之前轻松地拥有数千个。我记得在5年前用类似的设计达到了一些限制,它大约有7000个线程。

答案 1 :(得分:1)

看起来像一个好的设计。如果我是你,我会使用现有的nio框架,如netty

只需谷歌java nio frameworks,您就会找到几个带有示例和文档的框架。

更新

  

谢谢,但我更喜欢自己做这一切。这仅适用于我的侧面项目,其目的很大部分是

通过使用现有的框架并专注于游戏设计,你可以从一开始就自己做所有事情。

下次你会知道如何设计游戏,这样也可以更容易地设计IO框架。

答案 2 :(得分:1)

我会说(特别是)在Java中,线程更多是为了方便而不是为了性能(只有很多内核,我想你想控制哪些线程具有优先级)

您还没有说过有关消息交换量和客户端数量的任何信息,但您可能希望从单个线程处理网络IO的角度考虑更自然,并让它以紧密的方式发送传入的请求循环,并将ACTUAL工作(即在紧密循环中无法处理的请求)映射到线程池。 IIRC,在这样的设置中,限制因素将是您可以在单个线程中同时等待输入的最大TCP连接数。

为了增加乐趣,请将其与具有更轻量级线程的语言的解决方案进行比较,例如在Erlang中。

当然,正如@WhiteFang34所说,在您对代码进行严格的模拟/使用之前,您不需要这样的解决方案。在this question here中也可以找到相关技术(以及可以找到灵感的Netty等框架)。

线程创建需要一定的费用,mostly the per-thread stack