Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Socket.io:名称空间&;WS协议 步骤1:服务器_Node.js_Sockets_Http_Namespaces - Fatal编程技术网

Node.js Socket.io:名称空间&;WS协议 步骤1:服务器

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

我用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 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}]
    哪个是我从服务器定期发送的事件&some
    2
    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并开始在那里发送事件的方法