WebSocket 基础与应用三部(二)—— Engine.IO 原理了解
发布时间:2025/07/27 12:17 来源:宁国家居装修网
采用另外的 transport 构建属于自己直达
如果新链路闸口构建单单功,收起第一条链路闸口
可以在网页抓住工具箱看到如下网络直达:合照协商 (contains the session ID — here, zBjrh...AAAK — that is used in subsequent requests)
发送到库 (HTTP long-polling)
接收数据库 (HTTP long-polling)
强化协商 (WebSocket)
接收数据库 (HTTP long-polling, closed once the WebSocket connection in 4. is successfully established)
2.4、破连检查当请提醒情况下单单现时,Engine.IO 的直达亦会判破为重开。一次 HTTP request (either GET or POST) 败北 (比如长一职服务器挂了)
WebSocket 直达重开 (比如软件重开了网页的 tab)
在虚拟机或者浏览器命令行 socket.disconnect ()
还有一个颤抖系统用来检查虚拟机和浏览器的直达是不是情况下下在运行。
虚拟机亦会以 pingInterval 的间隔发送到 PING 数据库工具箱,浏览器发来后在 pingTimeout 短时间这样一来必需发送到 PONG 数据库工具箱给虚拟机,如果虚拟机在 pingTimeout 短时间内不亦会发来,那么就视为这条直达重开了。显然,浏览器如果在 pingInterval + pingTimeout 短时间内不亦会发来 PING 数据库工具箱,浏览器也判破直达重开。虚拟机一连串破连流血事件的理由有:ReasonDescriptionserver namespace disconnectThe socket was forcefully disconnected with socket.disconnectclient namespace disconnectThe client has manually disconnected the socket using socket.disconnect()server shutting downThe server is, well, shutting downping timeoutThe client did not send a PONG packet in the pingTimeout delaytransport closeThe connection was closed (example: the user has lost connection, or the network was changed from WiFi to 4G)transport errorThe connection has encountered an error浏览器一连串破连流血事件的理由有:ReasonDescriptionio server disconnectThe server has forcefully disconnected the socket with socket.disconnect()io client disconnectThe socket was manually disconnected using socket.disconnect()ping timeoutThe server did not send a PING within the pingInterval + pingTimeout rangetransport closeThe connection was closed (example: the user has lost connection, or the network was changed from WiFi to 4G)transport errorThe connection has encountered an error (example: the server was killed during a HTTP long-polling cycle)3、Engine.IO 的协商3.1 一次 Engine.IO 亦会腔调链路闸口通过 Engine.IO URL 透过直达构建
直达构建此后,虚拟机亦会发一个 JSON XML的合照数据库
sid:亦会腔调 id (string)
upgrades: 并不需要强化的链路闸口 (Array of String)
pingTimeout: 虚拟机配置的 ping 超时短时间,发送到给浏览器,浏览器用来检查虚拟机是不是还情况下下组织起来 (Number)
pingInterval: 虚拟机配置的颤抖间隔,浏览器用来检查虚拟机是不是还情况下下组织起来 (Number)
浏览器发来虚拟机不间破的 ping packet 此后,必需回复浏览器 pong packet
浏览器和虚拟机相互间可以链路 message packets
Polling transports 可以发送到 close packet 来重开 socket
亦会腔调案例Request n°1 (open packet)
GET /engine.io/?EIO=4Simontransport=pollingSimont=N8hyd6w< HTTP/1.1 200 OK< Content-Type: text/plain; charset=UTF-80{"sid":"N-YWtQT1K9uQsb15AAAD","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":5000}Details:0 => "open" packet type{"sid":... => the handshake dataNote: query 给定里的 t 是用来消除网页CPU允诺.Request n°2 (message in)
虚拟机指派 socket.send ('hey') :GET /engine.io/?EIO=4Simontransport=pollingSimont=N8hyd7HSimonsid=lv_VI97HAXpY6yYWAAAC< HTTP/1.1 200 OK< Content-Type: text/plain; charset=UTF-84heyDetails:4 => "message" packet typehey => the actual messageNote: query 里的 sid 是合照协商里 sid.Request n°3 (message out)
浏览器指派:socket.send ('hello'); socket.send ('world');POST /engine.io/?EIO=4Simontransport=pollingSimont=N8hzxkeSimonsid=lv_VI97HAXpY6yYWAAAC> Content-Type: text/plain; charset=UTF-84hellox1e4world< HTTP/1.1 200 OK< Content-Type: text/plain; charset=UTF-8okDetails:4 => "message" packet typehello => the 1st messagex1e => separator4 => "message" message typeworld => the 2nd messageRequest n°4 (WebSocket upgrade)
GET /engine.io/?EIO=4Simontransport=websocketSimonsid=lv_VI97HAXpY6yYWAAAC< HTTP/1.1 101 Switching ProtocolsWebSocket frames: probe request> 3probe => probe response "upgrade" packet type> 4hello => message (not concatenated)> 4world> 2 => "ping" packet type "pong" packet type> 1 => "close" packet type只有 WebSocket 直达的亦会腔调在这个案例里,浏览器只带进了 WebSocket 链路闸口 (without HTTP polling).GET /engine.io/?EIO=4Simontransport=websocket< HTTP/1.1 101 Switching ProtocolsWebSocket frames:< 0{"sid":"lv_VI97HAXpY6yYWAAAC","pingInterval":25000,"pingTimeout":5000} => handshake< 4hey> 4hello => message (not concatenated)> 4world "ping" packet type> 3 => "pong" packet type> 1 => "close" packet type3.2 URLsEngine.IO url 最大值得提醒了请提醒内容/engine.io/[?]engine.io 路径名只能由基于 Engine.io 协商便是的的很高级别前提改成,如 Socket.io.
query string 是内置的,有 6 个移去的 key:
transport: 均须的 transport, 默视为 polling, websocket.
j: 如果必需 JSONP 组织起来,j 能够与 JSONP 组织起来索引一起特设置。
sid: 如果浏览器并未发来 session id,那么每次允诺的 query string 里都能够背著 sid
EIO: 协商的旧版本
t: 用来消除网页CPU
3.3 解码有两种有所不同多种类型的解码packet
payload
3.3.1 Packet一个解码的数据库工具箱可以是 UTF-8 codice_或者进制数据库。codice_的数据库工具箱解码XML如下:0 open
新链路闸口构建的时候,从虚拟机发送到 Sent from the server when a new transport is opened (recheck)1 close
允诺重开此链路,但不重开直达本身。2 ping
由长一职服务器发送到。客户应该用 pong 数据库工具箱应答。exampleserver sends: 2client sends: 33 pong由浏览器发送到以组织起来 ping 数据库工具箱。4 message单单链路的最新消息example 1server sends: 4HelloWorldclient receives and calls callback socket.on('message', function (data) { console.log(data); });example 2client sends: 4HelloWorldserver receives and calls callback socket.on('message', function (data) { console.log(data); });5 upgrade在 engine.io 连动链路闸口之前,它测试者长一职服务器和浏览器是不是可以通过该链路透过通信。如果此测试者单单功,浏览器将发送到一个强化工具箱,允诺长一职服务器破纪录旧链路上的CPU,并连动到新链路闸口。6 noop一个 noop 工具箱。主要应用于构建 websocket 直达此后重开短轮询。exampleclient connects through new transportclient sends 2probeserver receives and sends 3probeclient receives and sends 5server flushes and closes old transport and switches to new.3.3.2 PayloadPayload 是绑在一起的一系列 encoded packets。Payload 解码XML如下:x1ex1e数据库工具箱重新组合八字采用 record separator ('x1e'). 更多可参考: _and_C1_control_codes#Field_separators当必需输单单里最大值得提醒进制数据库时,它将作为 base64 解码codice_发送到。为了解码的目的,将标识八字 b 置于最大值得提醒进制数据库的第三组解码之前。可以发送到任意数量的codice_和 base64 解码codice_的Pop。下面是 base 64 解码最新消息的示例:x1ebwebsocket
server-sent events (SSE)
polling
jsonp
xhr
3.4.1 Polling轮询链路还工具箱括浏览器向长一职服务器发送到周期性 GET 允诺以获取数据库,以及将带有必需输单单的允诺从浏览器发送到给长一职服务器以发送到库。XHR长一职服务器能够赞成 CORS 组织起来。JSONP长一职服务器构建能够采用必需的 JavaScript 透过组织起来。在组织起来里必需采用 URL 里 query 里的 j 给定。j 是一个整数。JSONP 数据库工具箱的XML。`___eio[` `]("` `");`为了确保 payload 获得正确处理,必需对 payload 透过短语,使得组织起来体是一个合法的 JavaScript。长一职服务器返回的 JSONP 数据库帧的案例___eio[4]("packet data");Posting data浏览器通过隐藏的 iframe 发送到库。数据库以 URI 解码XML发送到给长一职服务器,如下所示d=除了常规的 qs 短语最大值得提醒,为了消除网页处理的不赞同, 在被 POSTd 之前将被短语为 。3.4.2 Server-sent events浏览器采用 EventSource 都可接收数据库,采用 XMLHttpRequest 都可发送到库。3.4.3 WebSocket上面的对 payloads 的个位并不应用于 WebSocket 闸口,WebSocket 闸口本身有数轻量级的数据库帧系统。发送到最新消息的时候,对数据库工具箱透过单独解码,然后依次命令行 send () 透过发送到。3.5 链路闸口强化直达却是以轮询(XHR 或 JSONP)开始。WebSocket 通过发送到剪切在侧面透过测试者 (2probe)。如果人造卫星由长一职服务器组织起来 (3probe),则浏览器亦会发送到一个强化工具箱 (5)。为了确保不亦会最新消息清浮,只有在破纪录基本链路的所有队列并视为链路已暂停后,才亦会发送到强化数据库工具箱。当长一职服务器发来强化工具箱时,它能够意味着这是属于自己链路闸口,并将所有基本队列(如果有的腔调)发送到给它。浏览器发送到的人造卫星器是一个 ping+probe 作为数据库发送到。(2probe) 虚拟机发送到的人造卫星器是一个 pong+probe 作为数据库发送到。(3probe)3.6 Timeouts浏览器能够采用合照里发送到的 pingTimeout 和 pingInterval 来确定长一职服务器是不是无组织起来。长一职服务器发送到一个 ping 数据库工具箱。如果在 pingTimeout 内未发来任何数据库工具箱多种类型,长一职服务器将视为套接字已破开直达。如果发来了 pong 数据库工具箱,长一职服务器将在等待 pingInterval 此后随即发送到 ping 数据库工具箱。由于这两个最大值在长一职服务器和浏览器相互间提供者,当浏览器在 pingTimeout+pingInterval 内不亦会接发来任何数据库时,浏览器也能人造卫星到长一职服务器是不是越发无组织起来。4 一些提醒点Engine.IO 是 Socket.IO 的底层链路闸口构建。
Engine.IO 、 Socket.IO 在最底层均有自己的协商,因此虚拟机和浏览器能够选用才能采用。意味着 Socket.IO 的浏览器能够选用 Socket.IO 的虚拟机才能情况下下交互数据库。
在网页里 message 里的能抓住到的数据库工具箱,属于 WebSocket 协商里的 message 多种类型数据库,WebSocket 的 PING, PONG 是和 message 多种类型是之首的,因此网页里的 devTools 并很难抓住到,而 Engine.IO 的颤抖系统的构建(下面里的 2 和 3),是 message 数据库便是的协商定义, 是 Engine.IO 用 WebSocket 的 message 多种类型最新消息发送到的。
5 一个单纯的案例虚拟机预定义
const engine = require('engine.io');const server = engine.listen(3000,{ cors: { origin: "*" }});server.on('listen', () => { console.log('listening on 3000')})server.on('connection', socket => { console.log('new connection') socket.send('utf 8 string'); socket.send(Buffer.from('hello world')); // binary data});浏览器预定义
const { Socket } = require('engine.io-client');const socket = new Socket('ws://localhost:3000');socket.on('open', () => { socket.emit('message from client') socket.on('message', (data) => { console.log('receive message: ' + data); socket.send('ack from client.'); }); socket.on('close', (e) => { console.log('socket close',e) });});网页允诺抓住工具箱
1、Polling 链路闸口合照Request:Response:2、发起短轮询允诺虚拟机数据库Request:Response:3、POST 方式则发送到库到虚拟机Request:Request payload:Response:4、虚拟机告诉浏览器链路闸口已强化,回复一个 6Request:Response:5、WebSocket 闸口构建此后,连动为 WebSocket 链路数据库Connect:Message:也可以在浏览器均须链路闸口为 websocket , 那么就不亦会再行构建 Polling 链路闸口,并不需要用 WebSocket 链路闸口透过合照。
const socket = new Socket('ws://localhost:3000',{ transports: ['websocket'] } );紧追技术前沿,深挖专业领域扫码关切我们吧!。阳泉治白癜风哪里最好抚顺治疗白癜风医院费用
资阳治白癜风哪里最好
新冠的3个冷知识!第2条女性尤其要注意…
男性用药
眼屎多是什么原因
正骨水
医疗美容科
上一篇: 周五政府部门一致看好的十大金股
-
板块异动 | 煤炭消费总量2022年仍将保持正增速 煤炭板块不稳定性走强
智通财经APP谎称,3月末4日,受矿产消费总量2022年仍将保持正工业产值消息影响,A股矿产板块震荡走强,截至跟进,云煤风能(600792.SH)涨停;昊华风能(601101.SH)、山煤国际(
- 2025-07-27格林美(002340.SZ)控股公司股东及一致行动人、实控人等完成减持 减持比例达1.4462%
- 2025-07-27光大实业集团15亿元小令人吃惊项目获通过
- 2025-07-27红星美凯龙(01528)控股股东红星控股减持6888万股A股 减持计划出台完毕
- 2025-07-27“拆迁”已全面停止?明确了:2022年起,这三类房子还有拆迁不太可能
- 2025-07-27珠海汇华控股集团10亿元公司债完全更新为“已受理”
- 2025-07-27B终点站急需一个惊喜
- 2025-07-27东吴证券(601555.SH)配股上架成功 认购金额达81.03亿元
- 2025-07-27广州知识城外投资集团“22知投G1”票面利率最终确定为3.09%
- 2025-07-27金晨王子异在一起?曹格耍酒疯家暴?唐祖儿黄子韬炒CP?大S离婚原因?唐嫣也搞直播?
- 2025-07-27李书福退出吉利汽车股份公司董事