支持浏览器客户端和本地客户端之间的交互
Supporting interactions between browser clients and native clients
我的问题解释起来很简单,但我很难找到一个好的整体解决方案。
我想支持我的浏览器多人游戏,但我也希望它也可以在 Windows 和 Android(目前)上玩。我遇到的实际问题是我需要一个基本的 TCP 或 UDP 连接来工作,以便为客户端简化跨平台方面。我只知道 WebSockets 是一种 possible/viable 解决方案,用于在浏览器中创建实时客户端应用程序,但这也需要连接到 WebSocket 服务器。
现在,由于浏览器客户端没有任何可行的 WebSockets 替代方案,这表明下一个方法是 make/use 本机客户端的网络套接字库(windows 和android)。至少,这是我的第一个想法。我得出的结论是,这会增加太多的开销,让我无法在未来以我的技能水平和时间来处理和继续支持。我还读到其他语言(库等)的支持不完全符合 WS 标准,这让我进一步远离了这个想法。
我最后的想法让我想到了另外两个可能的解决方案,它们都有一些主要的缺点。
潜在解决方案 1 -- 总体来说非常弱
我尝试尝试的第一个解决方案似乎是目前最明显的选择,但有一个问题存在一些潜在的巨大缺陷。基本上,有两个服务器。一种适用于浏览器客户端,一种适用于本机客户端。这个问题是我隔离了一个可能很小也可能不小的玩家群。如果玩家群已经很小,我就会失去能够互相玩游戏的人。第二个大问题是,现在如果有人想从任何一个客户端登录他们的帐户,就需要一个通用数据库可供选择(两个服务器都可以访问)——如果我想从一个客户端启动一个客户端服务器,因为有人登录了不同的客户端,它需要服务器间验证,什么不需要。这听起来越来越严格,而且我越想越容易出现安全漏洞。
潜在解决方案 2 -- 在很多方面都比 1 强,但有 2 个大缺点。
我想出的最后一种方法似乎是最理想化的,但也有一些我过去读到过的可怕缺点。如果我有一个主服务器可以处理 WebSocket 和 UDP 连接之间的交互,这意味着我可以有一个服务器,而不必去本地化我的数据库,并且有来自浏览器和本机客户端的播放器。但最大的问题是,该服务器将通过两种不同的协议进行侦听 和 通过两种不同的协议发送。我不完全确定这有多大可能并且可能在 Node.JS 中实际组合,但我认为这是我最好的选择。我认为这种方法带来的最大问题是协议的混合。我过去曾读到,将 UDP 与 TCP 混合使用会导致 UDP 更频繁地下降,而 TCP 也会同样减慢速度。这最终可能会造成轻微的灾难性后果。
解决方案 2 是否与我认为的方法一样好?或者解决方案 1 实际上会更有优势。在这一点上,解决方案 1 似乎是一场等待发生的灾难。我在解决方案 2 中提到的问题至今是否仍然存在,是否有解决这些问题的方法?由于缺少更好的词,与 TCP 结合 UDP 相关的问题是否可以通过更多 "powerful" 服务器来解决。
您的服务器应该同时支持两者。 WebSocket 只是一种传输技术,您的服务器逻辑应该与传输无关。您的服务器应该监听两个端口,一个用于原始 TCP(或您的游戏使用的任何端口),另一个用于 WebSocket,您的应用程序的通信层应该为您的游戏逻辑抽象这一事实。
例如,您的常规 Web 服务器在两个不同的 TCP 端口中支持 HTTP 和 HTTPS,但是当您编写 Web 应用程序时,大多数时候,您并不关心每个客户端如何连接,您只需要编写您的应用程序逻辑,Web 服务器将为您处理每个客户端传输。
我的问题解释起来很简单,但我很难找到一个好的整体解决方案。
我想支持我的浏览器多人游戏,但我也希望它也可以在 Windows 和 Android(目前)上玩。我遇到的实际问题是我需要一个基本的 TCP 或 UDP 连接来工作,以便为客户端简化跨平台方面。我只知道 WebSockets 是一种 possible/viable 解决方案,用于在浏览器中创建实时客户端应用程序,但这也需要连接到 WebSocket 服务器。
现在,由于浏览器客户端没有任何可行的 WebSockets 替代方案,这表明下一个方法是 make/use 本机客户端的网络套接字库(windows 和android)。至少,这是我的第一个想法。我得出的结论是,这会增加太多的开销,让我无法在未来以我的技能水平和时间来处理和继续支持。我还读到其他语言(库等)的支持不完全符合 WS 标准,这让我进一步远离了这个想法。
我最后的想法让我想到了另外两个可能的解决方案,它们都有一些主要的缺点。
潜在解决方案 1 -- 总体来说非常弱
我尝试尝试的第一个解决方案似乎是目前最明显的选择,但有一个问题存在一些潜在的巨大缺陷。基本上,有两个服务器。一种适用于浏览器客户端,一种适用于本机客户端。这个问题是我隔离了一个可能很小也可能不小的玩家群。如果玩家群已经很小,我就会失去能够互相玩游戏的人。第二个大问题是,现在如果有人想从任何一个客户端登录他们的帐户,就需要一个通用数据库可供选择(两个服务器都可以访问)——如果我想从一个客户端启动一个客户端服务器,因为有人登录了不同的客户端,它需要服务器间验证,什么不需要。这听起来越来越严格,而且我越想越容易出现安全漏洞。
潜在解决方案 2 -- 在很多方面都比 1 强,但有 2 个大缺点。
我想出的最后一种方法似乎是最理想化的,但也有一些我过去读到过的可怕缺点。如果我有一个主服务器可以处理 WebSocket 和 UDP 连接之间的交互,这意味着我可以有一个服务器,而不必去本地化我的数据库,并且有来自浏览器和本机客户端的播放器。但最大的问题是,该服务器将通过两种不同的协议进行侦听 和 通过两种不同的协议发送。我不完全确定这有多大可能并且可能在 Node.JS 中实际组合,但我认为这是我最好的选择。我认为这种方法带来的最大问题是协议的混合。我过去曾读到,将 UDP 与 TCP 混合使用会导致 UDP 更频繁地下降,而 TCP 也会同样减慢速度。这最终可能会造成轻微的灾难性后果。
解决方案 2 是否与我认为的方法一样好?或者解决方案 1 实际上会更有优势。在这一点上,解决方案 1 似乎是一场等待发生的灾难。我在解决方案 2 中提到的问题至今是否仍然存在,是否有解决这些问题的方法?由于缺少更好的词,与 TCP 结合 UDP 相关的问题是否可以通过更多 "powerful" 服务器来解决。
您的服务器应该同时支持两者。 WebSocket 只是一种传输技术,您的服务器逻辑应该与传输无关。您的服务器应该监听两个端口,一个用于原始 TCP(或您的游戏使用的任何端口),另一个用于 WebSocket,您的应用程序的通信层应该为您的游戏逻辑抽象这一事实。
例如,您的常规 Web 服务器在两个不同的 TCP 端口中支持 HTTP 和 HTTPS,但是当您编写 Web 应用程序时,大多数时候,您并不关心每个客户端如何连接,您只需要编写您的应用程序逻辑,Web 服务器将为您处理每个客户端传输。