【问题标题】:Send additional data on socket connection在套接字连接上发送附加数据
【发布时间】:2011-06-12 05:32:07
【问题描述】:

如何在套接字连接时最好地发送附加数据?

客户:

socket.on('connect',function(){ 
//I'd like set some values and pass them up to the node server.
});

Node.js 服务器:

io.on('connection', function(client){
//I'd like to get the data here.
});

例如发送用户名或电子邮件地址等

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

    您应该在连接或创建时发送数据:

    var s = io('http://216.157.91.131:8080/', { query: "foo=bar" });
    s.connect();
    
    var c = io.connect('http://216.157.91.131:8080/', { query: "foo=bar" });
    

    使用new version of socket.io,服务器上的内容发生了变化:

    var io = require('socket.io')(server);
    
    io.use(function(socket, next) {
      var handshakeData = socket.request;
      console.log("middleware:", handshakeData._query['foo']);
      next();
    });
    

    【讨论】:

    • 我看到其他人说要使用socket.request.query,但这对我在 socket.io v1.7.2 上不起作用。一定要用socket.request._query
    • 为什么没有这方面的文档? github.com/socketio/socket.io-client/blob/master/docs/…
    • 对于socket.io v1.7.3,我必须使用socket.handshake.query(通过this answer)。
    • 无法发送多个参数?有谁知道语法? Fox 示例 { query: "foo=bar", "bar=foo" } 不起作用。
    • @Miquel 使用{query: 'var1='+foo+'&var2=bar'解决
    【解决方案2】:

    我有一个不同的方法 - 连接后立即发出一个事件,与数据:

    socket.on('connect',function(){ 
        // Send ehlo event right after connect:
        socket.emit('ehlo', data);
    });
    
    io.on('connection', function(client){
        // Receive ehlo event with data:
        client.on('ehlo', function(data) {
        });
    });
    

    你可以持有一个变量/对象,并且说,当没有带有数据的ehlo事件时,其他事件将被忽略,直到ehlo被发送。

    如果这不满足,你可以在连接时直接发送数据,我不会复制代码但它在这个答案中:https://stackoverflow.com/a/13940399/1948292

    【讨论】:

    • 这是传递数据以识别用户的好方法,例如访问令牌。如果您的服务器需要数据,您可能还想处理socket.on('reconnect', …),它可能会在断开连接后停止持久化。
    【解决方案3】:

    一旦建立 TCP 连接,connection 事件就会被触发。中间没有办法发送任何东西。

    您可以做的是简单地获取服务器发送的第一条消息并将数据放入该消息中。我强烈建议为此推出一些精简协议,因此您将拥有多种类型的消息并使用它们来确定代码应如何处理数据。

    这也将更具可扩展性,因为为此提出通用架构相当容易。如果您想先等待userdata 进入,您可以简单地为您的连接添加一些状态。

    【讨论】:

    • 嗨 Ivo,非常感谢您回复我。你能告诉我更多关于如何实现你所说的话的细节吗?再次感谢!
    • 基本上,我有一个可以工作的聊天应用程序,您可以在其中发送给特定的客户。问题是我无法将 sessionId 与用户名匹配。所以,如果你和我在聊天,而不是说“Dan”和“Ivo”,它会显示客户 ID。
    • 你能给我更多关于你的架构/代码的信息吗? ID从哪里来,名字从哪里来?应用程序不能不只是向服务器发出请求并询问与 ID 关联的用户名吗?
    • 用户名将来自数据库(即用户登录后)。 ID 来自 client.sessionId。老实说,我根据您对类似问题的回答实施了我的解决方案。我在客户端进入(连接时)时将它们添加到阵列中,并在断开连接时将它们删除。我将客户端 ID 通过消息传递给客户端并连接。它工作得非常好,非常感谢其他帖子:) 那么,你是说我应该调用数据库并尝试将 sessionid 与数据库中的字段匹配吗?
    • @Dan:只需将您的用户会话存储在 Redis 中,并将密钥存储在用户浏览器的 cookie 中。在套接字连接上获取 cookie 并将其发送回服务器。
    【解决方案4】:

    这是我将查询数据发送到 nodejs 和 server.io 服务器客户端的代码

    var socket = io.connect(window.location.origin,{query:'loggeduser=user1'});
    
    io.sockets.on('connection', function (socket) {
        var endp = socket.manager.handshaken[socket.id].address;
        console.log("query... " +  socket.manager.handshaken[socket.id].query.user);
    });
    

    查询...用户1

    【讨论】:

      【解决方案5】:

      这是我在套接字版本 2.1.1 上的代码

      //client side
      var socket = io.connect(window.location.origin,{query:'loggeduser=user1'});
      
      // server side
      io.socket.on('connection', function (socket) {
          console.log("loggeduser => " +  socket.handshake.query.loggeduser);
      });
      

      【讨论】:

      • 也适用于版本 3
      【解决方案6】:

      我发现这里的答案在这方面非常有用:Send custom data along with handshakeData in socket.io?

      还复习以下文档有助于解释将变量绑定到握手对象的方法,握手对象可以在连接期间从套接字对象访问:https://github.com/LearnBoost/socket.io/wiki/Authorizing#global-authorization

      【讨论】:

        【解决方案7】:

        我假设你会使用 SSL。

        使用查询字符串发送敏感数据不是一个好的安全做法 (why?)。 我认为,如果您需要发送非敏感数据,那么 Miquel 答案是最快和更容易的,但如果您需要发送敏感数据,那么像 Daniel W. 这样的方法是最好的方法。

        对于身份验证方法,您可以查看这个 github 项目 (socketio-auth),除了目前没有维护之外,它还可以让您很好地了解如何处理该问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-22
          • 1970-01-01
          • 1970-01-01
          • 2013-09-13
          • 1970-01-01
          • 2012-12-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多