我是node.js的新手,我想为eventdriven服务器实现我自己的系统(是的……重新发明轮子!)因为我想用手触摸这个如此简单的“socket.io – emit ()“ 方法.
谢谢你的帮助!
以下是socket.io的工作原理:首先,socket.io是一个位于webSocket之上的瘦协议层,所以我们真的要讨论webSocket的工作原理.
> webSocket连接以普通HTTP请求开始,该请求具有一个特殊标头集,即升级标头,它请求从HTTP协议升级到webSocket协议.
>当服务器收到请求并看到升级标头时,如果它支持该协议,则它会响应101响应(切换协议)和其他一些标头.当客户端收到此响应(以及其他一些与安全性相关的标头)时,两端都会将该套接字上的协议切换到webSocket协议.
>因为webSocket协议被设计为持续连接,所以客户端和服务器保持原始套接字打开以供将来通信,事实上,它保持开放,直到任何一方决定它们最终完成webSocket通信通道然后关闭套接字.
>因此,插座保持打开状态很长时间.这使得任何一方都可以随时向另一方发送消息.这就是它避免轮询的方式.而不是来自客户端的时间HTTP请求,询问服务器:“你有m的任何新数据吗?”,客户端可以坐在那里听取传入的消息.当服务器有新的东西发送客户端时,它已经有了这个打开的webSocket连接,它可以随时向客户端发送消息.
> Socket.io在webSocket上添加了一些功能.它添加的主要内容是:1)如果套接字连接因任何原因丢失,则自动重新连接; 2)从一端定期ping到另一端以检测何时连接丢失; 3)消息传递层使其变得微不足道将命名消息从一端发送到另一端.
I would like to know how socket.io methods work for emitting a certain
event, I’ve read that it is not like long-polling method but a
different one that can work on all of different browsers
这不是长轮询,因为它在客户端持续时间内保持套接字连接打开.这种长期,开放的连接可用于从客户端到服务器或从服务器到客户端发送消息,而无需在每次要发送时创建新连接.这适用于任何支持webSocket协议的浏览器.
How could a client keep-in-contact with the server without a long
polling request?
webSocket连接被设计为长期连接而不是典型的时间HTTP连接.
如果您想了解有关webSocket协议本身的更多信息,可以在此MDN文章中看到相当不错的描述:Writing webSocket Servers.
以下是打开webSocket的初始客户端请求的示例:
GET /chat HTTP/1.1 Host: example.com:8000 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13
并且,这是一个典型的服务器响应,它确认切换到webSocket协议:
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
然后,一旦协议被更改,这里的webSocket数据框如下所示:
0 1 2 3 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 +-+-+-+-+-------+-+-------------+-------------------------------+ |F|R|R|R| opcode|M| Payload len | Extended payload length | |I|S|S|S| (4) |A| (7) | (16/64) | |N|V|V|V| |S| | (if payload len==126/127) | | |1|2|3| |K| | | +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + 4 5 6 7 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | Extended payload length continued, if payload len == 127 | + - - - - - - - - - - - - - - - +-------------------------------+ 8 9 10 11 + - - - - - - - - - - - - - - - +-------------------------------+ | |Masking-key, if MASK set to 1 | +-------------------------------+-------------------------------+ 12 13 14 15 +-------------------------------+-------------------------------+ | Masking-key (continued) | Payload Data | +-------------------------------- - - - - - - - - - - - - - - - + : Payload Data continued ... : + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | Payload Data continued ... | +---------------------------------------------------------------+
Socket.io使用webSocket数据帧,但在该帧的有效负载内插入自己的消息格式,允许它发送命名消息.