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谢谢你的确认