当前位置: 首页 > 知识库问答 >
问题:

Websockets是如何实现的?

呼延俊良
2023-03-14
    null

如果我们等待的时间足够长,就会出现超时,导致客户端上出现以下消息。

这就是我在使用长轮询时所面临的问题。它停止进程以防止服务器过载,不是吗?

共有1个答案

董良策
2023-03-14

Websockets是如何实现的?

webSockets的实现方式如下:

  1. 客户端向服务器发出HTTP请求,请求上标头为“Upgrade”
  2. 如果服务器同意升级,则客户端和服务器交换一些html" target="_blank">安全凭据,现有TCP套接字上的协议从HTTP切换到WebSocket。
  3. 现在有一个持久的打开的TCP套接字连接客户端和服务器。
  4. 任何一方都可以在此打开的套接字上随时发送数据。
  5. 所有数据必须以非常特定的webSocket数据包格式发送。

就性能而言,它们怎么能比长轮询更好呢?

就其本质而言,长轮询有点像黑客。它的发明是因为没有更好的替代服务器发起的数据发送到客户机。以下是步骤:

  1. 客户端对来自客户端的新数据发出http请求。
  2. 如果服务器有一些新数据,它会立即返回这些数据,然后客户机发出另一个http请求,要求更多的数据。如果服务器没有新的数据,那么它只在连接上挂起一段时间而不提供响应,使请求挂起(套接字打开,客户机等待响应)。
  3. 如果在请求仍处于挂起状态的任何时候,服务器获得一些数据,那么它将这些数据形成一个响应,并为挂起的请求返回一个响应。
  4. 如果一段时间没有数据传入,那么最终请求将超时。此时,客户机将意识到没有返回新数据,并将启动一个新请求。
  5. 冲洗,起泡沫,重复。然后,返回的每一段数据或挂起请求的每一次超时都会跟随来自客户机的另一个ajax请求。

维护客户机和服务器之间的开放webSocket连接对于服务器来说是一件非常便宜的事情(它只是一个TCP套接字)。一个非活动但打开的TCP套接字不需要服务器CPU,只需要很少的内存来跟踪套接字。正确配置的服务器一次可以容纳数十万个打开的套接字。

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

以下是一些关于缩放主题的有用参考:

    null
 类似资料:
  • 与最新的Spring 4教程中的STOMP和SockJS一样,我们发现了以下类型的RequestMapping: 家庭控制器。JAVA 现在,我试图通过修改此requestmapping来实现多通道支持: MessageMapping不起作用,sendTo不返回到单独指定的URL。虽然我确实订阅了正确的频道,并且消息没有出现问题,如图所示 调试日志: 正在打开Web套接字。。。跺脚js:130 W

  • 我计划开发一个基于web的聊天应用程序,它接收ReSTful请求,将它们转换为XMPP,并将它们发送到XMPP服务器。 在这种基于聊天的应用程序中使用WebSocket看起来很有希望,因为事件(或响应)可以异步传递。但是,如果我使用WebSocket作为从浏览器传输请求的底层协议,这仍然可以被视为ReSTful设计吗?如果是的话,URI、动词(GET、POST…)是怎样的,websocket消息中

  • 我在理解和实现WebSocket中的permessage deflate扩展时遇到了一个问题。 到目前为止,我已经在握手代码中添加了“Sec-WebSocket-扩展: perMessage-收缩”。它似乎一切正常。 然而,当我从服务器(Node.js)向客户端(js)发送一条“TEST”消息时,似乎浏览器(Chrome和Firefox)本身并没有解压缩数据。 如何使用permessagedefl

  • 我想将一个道具传递给React组件,以父组件状态中的布尔值为条件,该组件希望将作为

  • 主要内容:1.ACID,2.隔离性,3.原子性,4.持久性,5.一致性1.ACID (Atomicity)原子性: 事务是最小的执行单位,不允许分割。原子性确保动作要么全部完成,要么完全不起作用; (Consistency)一致性: 执行事务前后,数据保持一致; (Isolation)隔离性: 并发访问数据库时,一个事务不被其他事务所干扰。 (Durability)持久性: 一个事务被提交之后。对数据库中数据的改变是持久的,即使数据库发生故障。 2.隔离性 四种隔离

  • 我正在构建一个复杂的聊天应用程序,使用WebSockets。我使用Node.js的socket.io库来实现协议。我应该为每个聊天创建单独的命名空间,还是为每个聊天创建单独的房间? socket.io中名称空间和房间的主要区别是什么?