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

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

客户:

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

Js 服务器:

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

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

86431 次浏览

The connection events get fired as soon as the TCP connection is established. There's no way to send anything in between.

What you can do is to simply take the first message send by the server and put the data in that message. I'd strongly suggest to roll some thin protocol for this, so you would have multiple types of messages and use those to determine how the code should process the data.

This would be more extendable too, since it's fairly easy to come up with a generic architecture for that. If you want to wait for the userdata to come in first you can simply add some state to your connections.

I found the answer located here really helpful in this regard: Send custom data along with handshakeData in socket.io?

Also brushing up on the following documentation helps explain ways to tie variables to the handshake object which can be accessed from the socket object during the connection: https://github.com/LearnBoost/socket.io/wiki/Authorizing#global-authorization

this my code for sending query data to nodejs and server.io server client

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

I have a different approach - emit an event right after connecting, with the data:

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

You can hold a variable/object, and say, when there is no ehlo event with data, the other events are ignored until ehlo is sent.

If this does not satisfy, you can send data right when connecting, I won't copy the code but it is in this answer: https://stackoverflow.com/a/13940399/1948292

You should send your data either in connect or on 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" });

With the new version of socket.io, on server is where the things have been changed:

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


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

this is my code on socket version 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);
});

I'm assuming you will use SSL.

Using querystrings to send sensitive data is not a good security practice (why?). I think that if you need to send non-sensitive data, then Miquel answer is the fastest and more easy one, but if sensitive data is what you need to send, then something like Daniel W. is the best approach to take.

For an authentication approach, you can take a look at this github project (socketio-auth) which, beyond the fact that it is currently with no maintenance, can give you a good idea of how to deal with the problem.