Node.js 在套接字连接上发送附加数据

Node.js 在套接字连接上发送附加数据,node.js,socket.io,Node.js,Socket.io,如何在套接字连接时最好地发送附加数据 客户: 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. }); 例如,发送用户名或电子邮件地址等。一旦建立TCP连接,就会触发连接事件。没

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

客户:

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

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

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

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


这将是更可扩展的,因为它是相当容易想出一个通用的架构。如果您想等待
用户数据
首先出现,您可以简单地为您的连接添加一些状态。

我发现这里的答案在这方面非常有用:


另外,复习一下以下文档有助于解释将变量绑定到握手对象的方法,握手对象可以在连接期间从套接字对象访问:

这是用于将查询数据发送到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);
});

query…user1

我有一种不同的方法-在连接后立即使用以下数据发出事件:

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


如果这不符合要求,您可以在连接时正确发送数据,我不会复制代码,但答案如下:

您应该在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" });
使用,服务器上的内容已更改:

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

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

这是我在socket版本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);
});
我假设您将使用SSL

使用querystring发送敏感数据不是一个好的安全实践()。 我认为,如果你需要发送非敏感数据,那么Miquel答案是最快、更简单的,但是如果你需要发送敏感数据,那么像Daniel W.这样的东西是最好的方法


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

嘿,伊沃,非常感谢你回复我。你能给我一点关于如何实现你所说的更详细的信息吗?再次感谢!基本上,我有一个工作聊天应用程序,你可以发送到特定的客户端。问题是我无法将sessionId与用户名匹配起来。因此,如果你和我在聊天,而不是说“Dan”和“Ivo”,它会显示客户id。你能给我更多关于你的架构/代码的信息吗?身份证从哪里来,名字从哪里来?难道应用程序不能向服务器发出请求并请求与ID关联的用户名吗?用户名将来自数据库(即用户登录后)。ID来自client.sessionId。老实说,我根据您对类似问题的回答实现了我的解决方案。我在客户端进入(连接时)阵列时添加它们,并在断开连接时删除它们。我通过消息将客户机ID传递给客户机并连接。它工作得非常好,非常感谢你的另一篇帖子:)那么,你是说我应该给数据库打个电话,并尝试将sessionid与数据库中的一个字段相匹配吗?@Dan:只需将你的用户会话存储在Redis中,并将密钥存储在用户浏览器的cookie中。在socket connect上获取cookie并将其发送回服务器。我看到其他人说要使用
socket.request.query
,但在socket.io v1.7.2上这对我不起作用。一定要使用
socket.request.\u query
。为什么没有这方面的文档?对于socket.iov1.7.3,我必须使用
socket.handshake.query
(via)。无法发送多个参数吗?有人知道语法吗?Fox示例
{query:“foo=bar”,“bar=foo”}
不起作用。@Miquel使用
{query:'var1='+foo+'&var2=bar'
解决了这个问题。这是传递数据以识别用户的好方法,就像访问令牌一样。您可能还需要处理
socket.on('reconnect',…)
如果您的服务器需要数据,它可能会在断开连接后停止持久化。适用于版本3too@Shubh谢谢你的确认