Node.js Socket.io:名称空间&;WS协议 步骤1:服务器
我用Node创建了一个简单的服务器&它在Node.js Socket.io:名称空间&;WS协议 步骤1:服务器,node.js,sockets,http,namespaces,Node.js,Sockets,Http,Namespaces,我用Node创建了一个简单的服务器&它在/my namespace下声明了一个名称空间。一旦有人连接,发出确认消息作为CONNECT\u ACK,并在3秒钟后发出另一个事件(例如SOME\u event),其中包含一个有效负载: const express = require('express'); const http = require('http'); const socketIO = require('socket.io'); let app = express(); let serv
/my namespace
下声明了一个名称空间。一旦有人连接,发出确认消息作为CONNECT\u ACK
,并在3秒钟后发出另一个事件(例如SOME\u event
),其中包含一个有效负载:
const express = require('express');
const http = require('http');
const socketIO = require('socket.io');
let app = express();
let server = http.createServer(app);
server.listen(3000, () => {
console.log('server listening on port 3000');
let io = new socketIO(server);
io.of('/my-namespace').on('connection', (socket) => {
console.log('welcome!');
socket.emit('CONNECT_ACK');
setTimeout(() => {
io.of('/my-namespace').emit('SOME_EVENT', { a: 4 });
}, 3000);
});
});
步骤2:客户端
然后,我创建了最小的客户端,当它接收到CONNECT\u ACK
或SOME\u事件时,它只连接到名称空间并记录日志
<!doctype html>
<html>
<head>
<title>example</title>
<script src="./node_modules/socket.io-client/socket.io.js"></script>
<script>
const endPoint = "http://localhost:3000/my-namespace";
io(endPoint)
.on('CONNECT_ACK', () => { console.log("I've connected"); })
.on('SOME_EVENT', (data) => { console.dir(data); });
</script>
</head>
<body>
</body>
</html>
例子
常量端点=”http://localhost:3000/my-名称空间”;
io(端点)
.on('CONNECT_ACK',()=>{console.log(“我已连接”);})
.on('SOME_EVENT',(data)=>{console.dir(data);});
第三步:检查一切都很棒
运行客户端节点index.js
并提供html(我使用Python简单服务器),我在两个控制台中都获得了所需的功能:
第四步。了解这里发生了什么
现在,当我打开Network
Chrome选项卡时,我开始写这篇长文章。这些是要求:
[WebSocket协议]:进入/socket.io
(而不是/my channel
)接收一些确认位;再次发布到/socket.io
,包括那些确认位。嗯
[我不明白]:再次访问/socket.io
,包括现在解析为CONNECT_ACK
事件的确认位:40ÿ40/my namespaceÿ42/my namespace,[“CONNECT_ACK”]
。这是我唯一能以这种方式接受的活动
[WS]:一个进入/socket.io
指示它是一个WebSocket的操作会返回101(交换协议),我可以通过以下方式接收MSG:42/my namespace,[“SOME_EVENT”,{“A”:4}]
哪个是我从服务器定期发送的事件&some2
s或3
s
[我也不明白]:再次访问/socket.io
,包括现在解决此问题的确认位:ÿ6
- 为什么客户端要求使用
socket.io
而不是/my channel
- 为什么在收到
CONNECT\u ACK
msg的WS-handshake之后会出现GET
- 我知道101中解析的“invertal”请求是套接字本身,而那些
2
s和3
s只是定期检查李>
- 为什么所有事件都以
42
开头(我已经检查过这一点没有改变)
- 最后的结果是什么?它是WS协议的一部分吗
为什么客户端要求使用socket.io
而不是/my channel
设置socket.io服务器
时,socket.io会将自身设置为拦截对/socket.io
的任何请求,以便工作。名称空间与HTTP中的路径使用相同的表示法,但含义完全不同,连接到名称空间对/socket.io
执行相同的HTTP请求,但其中包含不同的名称空间参数
为什么在WS-handshake接收CONNECT\u ACK msg后会有GET
我不能确定这一点,但它可能在WS请求之前到达服务器,并通过轮询发送CONNECT\u ACK
为什么所有事件都从42开始(我已经检查过这一点没有改变)
根据,它将数据包定义为类型为事件(2
)的消息(4
)。就我个人而言,我怀疑4
实际上是协议版本,目前是4
,因为它是文档中除数据包类型(必须是2
)以外的唯一引用该数字的文件
最后的结果是什么?它是WS协议的一部分吗
再次不确定,但可能是WS连接已经建立的确认,以及socket.io确认它应该从轮询切换到WS并开始在那里发送事件的方法