如何在套接字连接时最好地发送其他数据?
客户:
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:
您应该在连接或创建时发送数据:
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();
});
{ query: "foo=bar", "bar=foo" }
行不通的。
{query: 'var1='+foo+'&var2=bar'
我有另一种方法-连接数据后立即发出事件:
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
socket.on('reconnect', …)
服务器是否需要数据,断开连接后该数据可能会停止保留。
connection
一旦建立TCP连接,就会触发该事件。无法在两者之间发送任何内容。
您可以做的就是简单地获取服务器发送的第一条消息,并将数据放入该消息中。我强烈建议为此使用一些瘦协议,因此您将拥有多种消息类型,并使用这些消息来确定代码应如何处理数据。
这也将更加可扩展,因为为此提供通用的体系结构是相当容易的。如果您userdata
要先等待,则可以在连接中添加一些状态。
这是我的代码,用于将查询数据发送到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
我发现这里的答案在这方面真的很有帮助:在socket.io中发送自定义数据和握手数据?
仔细阅读以下文档也有助于解释将变量绑定到握手对象的方法,该对象可以在连接期间从套接字对象访问:https : //github.com/LearnBoost/socket.io/wiki/Authorizing#global-authorization
这是我在套接字版本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。
使用查询字符串发送敏感数据不是一个好的安全习惯(为什么?)。我认为,如果您需要发送非敏感数据,那么Miquel答案是最快,更简单的答案,但是如果您需要发送敏感数据,那么最好采用Daniel W.之类的方法。
对于身份验证方法,您可以看一下这个github项目(socketio-auth),该项目除了目前无需维护之外,还可以为您提供一个很好的方法来解决该问题。
socket.request.query
,但这在socket.io v1.7.2上对我不起作用。绝对要用socket.request._query
。