持续在线连接服务器

时间:2019-01-13 02:49:44

标签: tcp websocket udp online-game

因此,我一直在研究在线游戏,并且想知道它们如何与服务器建立如此快速,看似恒定的连接。我已经尝试过仅发送一堆XMLHttpRequest了,但是它们往往很慢。我也尝试过研究,但是有关该主题的大多数文章都谈论诸如Web套接字,tcp和udp之类的东西,这些概念我根本都不了解。我也正在尝试完成所有这些操作,而无需从外部来源导入代码,因此我可以更好地理解它们的工作原理。如果可以的话请帮忙。谢谢!

1 个答案:

答案 0 :(得分:0)

到目前为止,您的问题对这个平台来说太宽泛了。

我会简短地回答。

AJAX / XMLHttpRequest

每次发送数据时,XMLHttpRequest API都会(通常)打开与主机的新连接。这是一个非常昂贵的操作,并且会损害性能。

要考虑的另一点是,XMLHttpRequest始终发送验证和其他标头,从而浪费了客户端和服务器上的带宽和CPU周期。

还有一个问题,即这种方法通常基于轮询,因此即使没有更改或更新,数据也会被发送和处理。这不仅浪费,而且可能会伤害其他正在等待更新的客户端。

最后,AJAX / XMLHttpRequest将使用TCP / IP连接,如果您必须确保按顺序到达整个数据但会导致性能下降,那将非常有用。

WebSockets

WebSockets是在流式连接(例如TCP / IP连接(或管道或unix套接字))上运行的协议。

一旦建立连接,它便是持久的,并允许双向通信。这样,客户端和服务器均可启动更新而无需轮询,也无需额外费用(标头,重新身份验证等)。

WebSockets仍位于流式套接字(例如TCP / IP套接字)上,该套接字会导致性能const交换数据完整性(所有数据按顺序到达)。

TCP / IP套接字

TCP / IP是流协议,而不是基于消息的协议。因此,它通常与其他协议(例如WebSockets或自定义创作的协议)一起使用。

由于WebSockets会在99.9%的时间内使用TCP / IP(除非在同一台计算机上或在特定的特殊场合使用),所以我在WebSockets中描述的相同问题在这里适用。

但是,通过将自定义协议与TCP / IP结合使用,可以实现一些性能优化(价格与网络连接性和中间干扰有关)。

UDP(数据报)

许多游戏不需要数据完整性。某些数据包是否丢失无关紧要,最重要的是最新信息尽快到达。

这是UDP套接字进入的地方。没有高成本的连接协商阶段(就往返而言,UDP实际上是免费的),没有数据完整性测试层可能会阻止从中传入的数据订单。

由于这些原因,某些游戏需要UDP套接字才能进行快速更新,同时仍使用TCP / IP连接来存储必须安全到达的数据。