gpt4 book ai didi

javascript - 如何实现Websocket?

转载 作者:可可西里 更新时间:2023-11-01 01:37:00 25 4
gpt4 key购买 nike

  • 如何实现Websocket?
  • 这项新技术背后的算法是什么(与长轮询相比)?
  • 在性能方面如何比长轮询更好?

  • 我问这些问题是因为 here we have a sample code of Jetty websocket implementation (server-side)

    If we wait long enough, a timeout will occur, resulting in the following message on the client.



    这绝对是我使用长轮询时面临的问题。它停止了该过程以防止服务器重载,不是吗?

    最佳答案

    How Websockets are implemented?



    webSockets的实现如下:
  • 客户端使用请求
  • 上的“upgrade” header 向服务器发出HTTP请求
  • 如果服务器同意升级,则客户端和服务器将交换一些安全凭据,并且现有TCP套接字上的协议(protocol)将从HTTP切换为webSocket。
  • 现在存在一个持久的开放TCP套接字,用于连接客户端和服务器。
  • 任何一方都可以随时在此打开的套接字上发送数据。
  • 所有数据必须以非常特定的webSocket数据包格式发送。

  • 因为只要双方都同意,套接字就保持打开状态,因此这为服务器提供了一个 channel ,可在有新内容发送时将信息“推送”给客户端。与使用客户端驱动的Ajax调用(客户端必须定期轮询新信息)相比,这通常效率更高。而且,如果客户端需要向服务器发送大量消息(例如,类似多人游戏),那么使用已经打开的套接字向服务器发送快速消息也比Ajax调用更有效。

    由于启动webSocket的方式(从HTTP请求开始,然后重新使用该套接字),它们与现有Web基础结构100%兼容,甚至可以与现有Web请求在同一端口上运行(例如端口80或443)。这样可以简化跨域安全性,并使客户端或服务器端基础结构上的任何人都不必修改任何基础结构来支持webSocket连接。

    What is the algorithm behind this new tech (in comparison to Long-Polling)?



    这里有一个关于webSocket连接算法和webSocket数据格式如何工作的很好的总结: Writing WebSocket Servers

    How can they be better than Long-Polling in term of performance?



    从本质上讲,长轮询有点麻烦。发明它是因为没有更好的替代方法可以将服务器启动的数据发送给客户端。步骤如下:
  • 客户端从客户端发出http请求以获取新数据。
  • 如果服务器有一些新数据,它将立即返回该数据,然后客户端发出另一个http请求以请求更多数据。如果服务器没有新数据,则它只是在没有提供响应的情况下卡在连接上一会儿,而使请求挂起(套接字处于打开状态,客户端正在等待响应)。
  • 如果在请求仍悬而未决的任何时候,服务器获取了一些数据,则它将这些数据形成为响应,并为未决请求返回响应。
  • 如果一段时间没有任何数据输入,则最终请求将超时。到那时,客户端将意识到没有返回新数据,它将启动一个新请求。
  • 冲洗,起泡,重复一遍。然后,每个返回的数据片段或每个未决请求的超时都将跟着来自客户端的另一个ajax请求。

  • 因此,尽管webSocket使用一个长期存在的套接字,客户端或服务器可以通过该套接字向另一个发送数据,但长期轮询是由客户端询问服务器“您是否还有其他数据吗?”组成。一遍又一遍,每遍都有一个新的http请求。

    只要正确完成长时间轮询,它在服务器基础结构,带宽使用率,移动电池生命周期等方面的效率就不会那么高。

    What I want is explanation about this: the fact Websockets keep an open connection between C/S isn't quite the same to Long Polling wait process? In other words, why Websockets don't overload the server?



    维护客户端和服务器之间的开放式WebSocket连接对于服务器来说是一件非常便宜的事情(只是TCP套接字)。非 Activity 但开放的TCP套接字不占用服务器CPU,仅占用很少的内存来跟踪套接字。正确配置的服务器可以一次容纳成千上万个打开的套接字。

    另一方面,进行长轮询的客户端,即使没有任何新信息要发送给它的客户端,也必须定期重新建立其连接。每次重新建立新连接时,都会进行TCP套接字拆除和新连接,然后再处理传入的HTTP请求。

    以下是有关扩展主题的一些有用引用:
  • 600k concurrent websocket connections on AWS using Node.js
  • Node.js w/1M concurrent connections!
  • HTML5 WebSocket: A Quantum Leap in Scalability for the Web
  • Do HTML WebSockets maintain an open connection for each client? Does this scale?
  • 关于javascript - 如何实现Websocket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34730334/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com