基本上,你有3个选择在写这篇文章的时间:
的WebSockets
的WebSockets是一个轻量级的消息传递协议,它利用TCP,而不是一个Javascript实现TCP套接字的,因为你”已经指出。但是,除了最初的握手之外,还没有HTTP标头在该点之后传递。连接建立后,数据可以自由通过,开销很小。
长轮询
长轮询,概括地说,定期涉及到客户端轮询新的信息的服务器的HTTP请求。这在CPU和带宽方面非常昂贵,因为您每次发送大量新的HTTP标头。这对于旧浏览器来说实质上是您唯一的选择,而像Socket.io这样的库在这些情况下使用长轮询作为后备。
的WebRTC
除了什么已经被提及,的WebRTC允许通过UDP通信。由于UDP开销低(相对于TCP),低延迟和非阻塞性质,UDP在非网络环境中一直用于多人游戏。
TCP“保证”每个数据包将到达(除了灾难性的网络故障),并且他们将始终以发送的顺序到达。这对于重要信息(如注册乐谱,点击,聊天等)非常有用。
另一方面,UDP没有这样的保证。数据包可以以任何顺序到达,或根本不会。当涉及以较高频率发送并且需要尽快到达的较不重要的数据时,这实际上是有用的,例如播放器位置或输入。原因在于如果在传输期间单个数据包延迟,TCP流将被阻止,从而导致游戏状态更新中的较大差距。使用UDP,您可以简单地忽略延迟到达(或根本不到)的数据包,并继续下一次收到的数据包,为玩家创造更流畅的体验。
在撰写本文时,WebSocket可能是您最好的选择,尽管WebRTC的采用正在迅速扩大,并且在您完成游戏时可能更可取,所以这是需要考虑的问题。
实际上每个传输只包含两个字节的开销。 http握手只发生在打开新的websocket时,并且只要浏览器停留在该页面上,您就可以保持websocket处于打开状态。 –
是的,他们是。 HTTP握手完成一次以打开套接字。所以如果你在一封邮件后关闭套接字,开销会很大,如果你永远保持套接字打开,那么开销就不大。 – Raynos
为什么握手过程如此复杂?从我记得的,我们必须读一些字符串,其中最后一个字符是[随机]字符集合,然后必须以某种方式对base64进行编码并发送回客户端。我试图自己编写所说的服务器端握手代码,但它不起作用(握手过程从未完成,所以我永远无法发送和检索自己的数据包)。当使用其他人编写的Java程序包来做同样的事情时,我达到了同样的结果。 – Josh1billion