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

时间:2011-01-20 04:59:18

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

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

7 个答案:

答案 0 :(得分:49)

您应该在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" });

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

答案 1 :(得分:21)

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

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

答案 2 :(得分:12)

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

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

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

答案 3 :(得分:6)

这是我向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

答案 4 :(得分:5)

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

我假设您将使用SSL。

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

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