在套接字连接上发送其他数据


79

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

客户:

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

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

Answers:


66

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

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

我见过其他人说要使用socket.request.query,但这在socket.io v1.7.2上对我不起作用。绝对要用socket.request._query
凯伦'16


4
对于socket.io v1.7.3,我不得不使用socket.handshake.query(通过此答案)。
加伦·隆

无法发送多个参数?有人知道语法吗?福克斯的例子是{ query: "foo=bar", "bar=foo" }行不通的。
Adry

1
@Miquel解决了使用{query: 'var1='+foo+'&var2=bar'
Adry

31

我有另一种方法-连接数据后立即发出事件:

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


6
这是一种用于传递数据以标识用户的好方法,例如访问令牌。您可能还想处理socket.on('reconnect', …)服务器是否需要数据,断开连接后该数据可能会停止保留。
伊恩·柯林斯

15

connection一旦建立TCP连接,就会触发该事件。无法在两者之间发送任何内容。

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

这也将更加可扩展,因为为此提供通用的体系结构是相当容易的。如果您userdata要先等待,则可以在连接中添加一些状态。


嗨,伊沃,非常感谢您回到我身边。您能否详细说明如何实现您所说的话?再次感谢!

基本上,我有一个正常的聊天应用程序,您可以在其中发送给特定的客户。问题是我无法将sessionId与用户名匹配。因此,如果您和我聊天,则不会显示“ Dan”和“ Ivo”,而是显示客户端ID。

您能给我更多有关您的体系结构/代码的信息吗?ID来自何处,名称来自何处?该应用程序不仅不能向服务器发出请求并询问与ID关联的用户名吗?
伊沃·韦策尔

用户名将来自数据库(即用户登录后)。ID来自client.sessionId。老实说,我根据您对类似问题的回答实施了我的解决方案。我将客户端(连接时)添加到阵列中,并在断开连接时将其删除。我通过消息将客户端ID传递给客户端并进行连接。它确实运行良好,所以非常感谢其他帖子:)那么,您是说我应该打电话给数据库,并尝试将sessionid与数据库中的字段进行匹配吗?

@Dan:只需将您的用户会话存储在Redis中,并将密钥存储在用户浏览器的cookie中即可。在套接字连接上获取cookie,并将其发送回服务器。
2011年

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

查询... user1



2

这是我在套接字版本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);
});

1

我假设您将使用SSL。

使用查询字符串发送敏感数据不是一个好的安全习惯(为什么?)。我认为,如果您需要发送非敏感数据,那么Miquel答案是最快,更简单的答案,但是如果您需要发送敏感数据,那么最好采用Daniel W.之类的方法。

对于身份验证方法,您可以看一下这个github项目(socketio-auth),该项目除了目前无需维护之外,还可以为您提供一个很好的方法来解决该问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.