【问题标题】:Generating socket.io at Server side as Rest request在服务器端生成 socket.io 作为 Rest 请求
【发布时间】:2013-02-22 21:35:22
【问题描述】:

有一种方法可以在服务器端管理 socket.io 创建吗?目前,我找不到任何文档,仅发现与客户端相关的套接字是根据来自客户端的请求创建的 "io.connect (服务器)”

当前流程工作正常:

  1. 在 SERVER:PORT 设置 Socket.io(在 Node.js 中)
  2. 客户端连接到服务器
    • 使用 io.connect(SERVER:PORT)

不知道有没有可能?尝试做:

  1. 在 SERVER:PORT 处设置 Socket.io(在 Node.js 中)
  2. 收到 POST (REST) - 服务器端
    • 在服务器端创建/打开 Socket.io。
    • 在 Post 的响应中发送 id?
  3. 客户端打开了一个socke.io

发送到客户端socket.id到客户端

【问题讨论】:

    标签: node.js websocket socket.io


    【解决方案1】:

    到目前为止,您做得对,如果我正确理解您的问题,您正在尝试通过 POST 验证连接,因此如果服务器响应 ID,用户只能通过套接字连接到服务器。这是一个迂回的方式。使用套接字而不是 POST。

    Socket服务器必须已经运行,并且通过io.sockets.on('connection')接受连接,在服务器上你可以选择是接受还是拒绝它,做socket.disconnect('unauthorized')关闭与服务器的连接。

    我建议你这样做:

    1. 在 SERVER:PORT 处设置 Socket.io(在 Node.js 中)
    2. 客户端使用 io.connect(SERVER:PORT) 连接到 SERVER
    3. 通过套接字在 POST 中发送您要发送的内容。
    4. 在服务器上对io.sockets.on('connection', function(socket) 进行身份验证/处理。
    5. 如果未经授权,请关闭套接字。
    6. 将 ID 数据发回给客户端。

    【讨论】:

    • 谢谢,但我错过了一些东西,在客户端我有一个 ID,这个 ID 将添加到 io.connect(server) 或作为 io.socket.emit 的一部分?
    • 您应该通过 socket.emit() 发送 id 作为数据(第二个参数)来发送 ID。然后服务器/客户端可以从 socket.on() 中读取并使用它。
    【解决方案2】:

    这似乎不可能——虽然 socket.io 的官方文档是 lacking,但 net module 的文档表明创建套接字的唯一方法是在服务器端启动它。 但是,您仍然可以通过在服务器上为套接字创建一个 id 以与套接字关联来达到预期的效果。也就是说,

    1. 在 SERVER:PORT 处设置 Socket.io(在 Node.js 中)
    2. 收到 POST (REST) - 服务器端
    3. 创建 id(注意:这可以在第 2 步之前完成)
    4. 在 Post 的响应中发送 id!
    5. 客户端连接到服务器
      • 使用 io.connect(SERVER:PORT)
    6. 客户端使用类似的方式将 id 发送到服务器

      socket.emit("set_id",id)
      
    7. 服务器收到 id 并使用类似的方式将其与套接字相关联

      socket.on("set_id",function(id){
          socket.set("id",id)
      }
      
    8. 现在您可以使用您创建的 id 来引用套接字了!

    祝你好运!

    【讨论】:

      【解决方案3】:

      到目前为止,深入研究代码和文档,我发现 socket.io 支持命名空间,所以我使用它来管理客户端连接 ID。

      在 server.js 中

        var app = express();
          var server = require('http').createServer(app),
          io = require('socket.io').listen(server,{ log: false });
          // Rest New Process
          function generateNameSpaceWs (responce, request) { 
             io.of("/" + id).on('connection', handler);
            response.send(id);
          }
          app.post("/newWS", function (res, req) {
             return generateNameSpaceWs(res, req);
          }
      

      在 Client.js

      function makeWS(){
          var ws, c = new XMLHttpRequest();
          c.open("GET", url, false);
          c.send();
          if (c.status == 200){
              id = JSON.parse(c.responseText);
               ws = new io.connect("server/" + id)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-26
        • 2017-12-03
        • 1970-01-01
        • 2016-02-27
        相关资源
        最近更新 更多