gpt4 book ai didi

node.js - 套接字 : Namespace & WS protocol

转载 作者:搜寻专家 更新时间:2023-10-31 23:23:59 26 4
gpt4 key购买 nike

第一步:服务器

我用 Node & Socket.io 创建了一个简单的服务器它在 /my-namespace 下声明了一个命名空间。一旦有人连接,发出确认消息作为 CONNECT_ACK 并在 3 秒后发出另一个带有有效载荷的事件(例如 SOME_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);
});
});

第二步:客户端

然后,我创建了最小的客户端,它只连接到命名空间并在收到 CONNECT_ACKSOME_EVENT 时记录日志

<!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>

第 3 步:检查一切正常

运行客户端 node index.js 并提供 html(我使用 Python Simple Server)我在两个控制台中都得到了所需的:

client side

enter image description here

第 4 步。了解这里发生了什么

现在,当我打开 Network Chrome 选项卡时,我开始写这篇长文章。这些是请求:

  1. [WebSocket 协议(protocol)]:GET 到 /socket.io(不是到 /my-channel) 接收一些确认位;再次 POST 到 /socket.io,包括那些确认位。好的。
  2. [我不明白]:再次向 /socket.io 发送 GET,包括确认位,现在解析为 CONNECT_ACK 事件:ÿ40ÿ40/my-namespaceÿ42/my-namespace,["CONNECT_ACK"]。这是我将以这种方式接收的唯一事件。
  3. [WS]:到 /socket.io 的 GET 指示它是一个 websoket 返回 101(切换协议(protocol)),我可以收到消息:42/my-namespace,["SOME_EVENT",{"a":4}]这是我从服务器和一些 23 定期发送的事件
  4. [我也不明白]:再次 GET 到 /socket.io,包括现在解析为这个东西的确认位:ÿ6

  • 为什么客户端请求 socket.io 而不是 /my-channel
  • 为什么在接收 CONNECT_ACK 消息的 WS 握手之后有一个 GET?
  • 我知道在 101 中解决的“不朽”请求是套接字本身,而那些 23 只是定期检查。
  • 为什么所有事件都以 42 开始(我检查过这不会改变)
  • 最后的 GET 是什么?它是 WS 协议(protocol)的一部分吗?

最佳答案

Why does the client asks for socket.io instead of /my-channel?

当设置 socket.io-server 时,socket.io 将自己设置为拦截任何对 /socket.io 的请求,以便正常工作。命名空间使用与 HTTP 中的路径相同的表示法,但含义完全不同,连接到命名空间对 /socket.io 执行相同的 HTTP 请求,但其中包含不同的命名空间参数。

Why there is a GET after the WS handshake which receives CONNECT_ACK msg?

我不能确定这个,但这可能在 WS 请求之前到达服务器,并改为通过轮询发送 CONNECT_ACK

Why does all the events start by 42 (I've checked this does not change)

根据 this GitHub issue , 它将数据包定义为类型为 event (2) 的 message (4)。就我个人而言,我怀疑 4 实际上是协议(protocol)版本,目前是 4,因为它是文档中对该数字的唯一引用,除了数据包类型(然后必须是 2).

What is that final GET? is it part of the WS protocol?

再次不确定,但可能确认 WS 连接已经建立,并且是 socket.io 确认它应该从轮询切换到 WS 并开始向那里发送事件的一种方式。

关于node.js - 套接字 : Namespace & WS protocol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39274009/

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