发送有关套接字连接的其他数据

Dan*_*Dan 67 node.js socket.io

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

客户:

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

Node.js服务器:

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

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

Miq*_*uel 53

您应该在connect或create上发送数据:

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" });
Run Code Online (Sandbox Code Playgroud)

使用新版本的socket.io,在服务器上就是事情发生了变化:

var io = require('socket.io')(server);

io.use(function(socket, next) {
  var handshakeData = socket.request;
  console.log("middleware:", handshakeData._query['foo']);
  next();
});
Run Code Online (Sandbox Code Playgroud)

  • 对于socket.io v1.7.3,我不得不使用`socket.handshake.query`(通过[this answer](http://stackoverflow.com/questions/13745519/send-custom-data-along-with-handshakedata-在插座-10)). (3认同)
  • @Miquel 使用 `{query: 'var1='+foo+'&var2=bar'` 解决 (2认同)

Dan*_* W. 25

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

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) {
    });
});
Run Code Online (Sandbox Code Playgroud)

您可以保存变量/对象,并说,当没有ehlo数据事件时,其他事件将被忽略,直到ehlo发送为止.

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

  • 这是一种用于传递数据以识别用户的好方法,例如访问令牌。如果服务器需要数据,您可能还想处理`socket.on('reconnect',…)`,它在断开连接后可能会停止持续存在。 (3认同)

Ivo*_*zel 12

connection一旦建立TCP连接,事件就会被触发.没有办法在两者之间发送任何东西.

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

这也可以更加扩展,因为为此提出通用架构相当容易.如果您想等待userdata首先进入,您只需在连接中添加一些状态即可.


小智 7

这是我的代码,用于向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);
});
Run Code Online (Sandbox Code Playgroud)

查询... USER1


Man*_*ana 6

这是我在套接字版本 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);
});
Run Code Online (Sandbox Code Playgroud)

  • 也适用于版本 3 (2认同)

Art*_*gel 5

我发现这里的答案在这方面非常有用:在socket.io中发送自定义数据和handshakeData?

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