Design patterns 如何设计游戏服务器的通信通道

Design patterns 如何设计游戏服务器的通信通道,design-patterns,node.js,redis,Design Patterns,Node.js,Redis,我计划设计一个游戏服务器。我希望它能承受很重的负载,可重用,灵活,但易于编程,我想在这些方面取得平衡 我决定使用nodejs和redis,protocal的数据格式是JSON和websocket 我有web开发的经验,但不知道游戏服务器的开发,我注意到游戏服务器非常实时,消息不是点对点,而是发布子频道 nodejs、redis、JSON是设计通信通道的好选择吗?大多数浏览器支持websocket吗 也许问题太多了,唯一的问题是如何为游戏服务器设计一个通信通道?你似乎在大量推广中。当然也有点对点的

我计划设计一个游戏服务器。我希望它能承受很重的负载,可重用,灵活,但易于编程,我想在这些方面取得平衡

我决定使用nodejs和redis,protocal的数据格式是JSON和websocket

我有web开发的经验,但不知道游戏服务器的开发,我注意到游戏服务器非常实时,消息不是点对点,而是发布子频道

nodejs、redis、JSON是设计通信通道的好选择吗?大多数浏览器支持websocket吗


也许问题太多了,唯一的问题是如何为游戏服务器设计一个通信通道?

你似乎在大量推广中。当然也有点对点的游戏协议,这完全取决于游戏的设计,无论它是否使用集中服务器


此外,许多游戏使用二进制协议,为了节省带宽,比特流非常常见。JSON与那个世界至少相差几个数量级,所以也许您应该将您的范围从“游戏”限制到更有限的范围。在这里,您似乎过于泛化了。

我的大多数浏览器都不支持WebSocket,它们都安装在终端用户的PC上。尝试通过HTTPS(通过SSL避免愚蠢的代理在传递之前要完全加载无休止加载的iframe)使用无休止加载的iframe来接收数据,这是广泛支持的。对于发送,使用AJAX请求

通过http使iframe页面推送行如下所示:

<script>newData("...")</script>
newData(“…”)

如果这对您来说太慢,请使用flash/java小程序进行通信。

首先,下次使用真正的标记,以便人们真正找到您的问题

关于实际问题,yes Node.js非常适合多人游戏,尤其是WebSocket。。。但由于最近发现了配置错误的代理服务器的安全问题(这实际上不是WebSocket的错,而是每个人和他们的妈妈对此都感到恐慌),这些问题已经推迟了至少半年

有关详细信息:

同时。。。 如果你想让游戏的延迟时间小于100毫秒,你就只能使用闪存插座作为后援

而且,JSON是一个坏主意。它对于发送游戏数据来说是非常臃肿的,当我用Node.js创建我的第一个多人游戏时,我所做的就是创建。这就像是JSON的替代品,它不支持JSON的100%特性,但它致力于编码数据的小规模和速度

因此,如果你愿意尝试使用WebSockets或在不久的将来使用Flash sockets,那么你应该看看我制作的两款游戏:

(欧弗洛里亚战略游戏)
(小行星/几何战争倍增器交叉)


但请记住,根据您的游戏类型,您需要的不仅仅是发送消息,特别是如果您想进行延迟补偿等。我建议,对于通信频道,它在浏览器支持的任何功能之上提供类似WebSocket的API。它回到Flash套接字,然后回到jsonp,并根据需要进行长轮询。它在Node中得到了很好的支持,当用户的浏览器本机启用WebSocket时,情况会自动变得更好

您可以在不到100ms的时间内完成http请求——在家里,我经常看到~75ms从Google AJAX API服务器获得25K jquery.min.js,而~25ms返回未修改的jquery.min.js——但这需要仔细的工程来确保。如果您有一个keepalive连接,那么您就没有连接设置开销(如果您正在使用SSL保护用户凭据,这一点尤其重要),因此它可能会更快


即便如此,我还是会使用socket.io,因为它也提供了一个很好的API。

greate,类似于JSONP,但更实时的是,一个无休止加载的页面是否可以被nginx压缩?我想开发一个快速的web游戏,所以我选择了JSON,我认为压缩的JSON类似于二进制,对吗?嗯,这当然很有帮助。既然你已经充分取笑了他们,也许你可以指出逻辑上的缺陷?毕竟,这是一个问答网站。这两款游戏使用了哪个版本的node.js。野牛能支持java吗?@guilin2.x版本的Shooter和3.x版本的Orbit。Java支持,你必须自己为Java编写一个BiSON版本。当我查看你的orbit/server/lib/socket.js代码时,我有一个问题——什么是fluffsocket?@guilin这只是我为我的另一个项目(使用谷歌V8作为游戏引擎)所做的一个简单协议,最初我想把orbit移植到那个项目上,编写自己的协议比用C++/JS实现WebSocket更容易。你是说2个不同的协议共享1个服务器套接字。我不明白为什么WebSocket和FluffSocket的读/写方法如此不同?为什么\x00\xff环绕数据?