88

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

客户:

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.
});

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

4

7 回答 7

74

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

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" });

使用新版本的 socket.io,在服务器上进行了更改:

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

io.use(function(socket, next) {
  var handshakeData = socket.request;
  console.log("middleware:", handshakeData._query['foo']);
  next();
});
于 2014-10-12T09:30:25.300 回答
34

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

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

于 2014-06-01T11:45:53.327 回答
16

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

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

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

于 2011-01-20T11:48:10.043 回答
8

这是我将查询数据发送到 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

于 2014-03-29T20:16:43.363 回答
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);
});
于 2018-06-11T07:10:00.770 回答
5

我发现这里的答案在这方面真的很有帮助:在 socket.io 中将自定义数据与握手数据一起发送?

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

于 2013-08-27T05:27:17.420 回答
0

我假设您将使用 SSL。

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

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

于 2019-12-05T15:33:48.057 回答