如何用Node.js唯一标识一个套接字

TLDR; 如何在基于事件的编程模型中识别套接字。

我刚开始使用node.js,过去我已经完成了大部分C ++和PHP sockets()的编码工作,所以node.js对我来说是一个非常新的东西。

在c ++中,为了识别一个套接字,我们可以做一些事情,比如编写一个主套接字说服务器来监听新的连接和更改,然后相应地处理这些连接。

如果你正在寻找实际的套接字而不是socket.io,它们确实存在。

但是如前所述,Node.js和Javascript使用基于事件的编程模型,因此您创build一个(TCP)套接字,监听IP:端口(类似于绑定),然后接受连接事件,这些事件传递一个代表连接的Javascript对象。

从这里你可以得到FD或其他标识符,但是这个对象也是一个长寿命的对象,如果你愿意的话,这个对象可以存储一个标识符(这就是socket.io所做的)。

var server = net.createServer(); server.on('connection', function(conn) { conn.id = Math.floor(Math.random() * 1000); conn.on('data', function(data) { conn.write('ID: '+conn.id); }); }); server.listen(3000); 

提摩太的方法是好的,唯一要提到的是 – Math.random()可能会导致id的重复。 所以它会产生相同的随机数的机会真的很小,但可能会发生。 所以我build议你使用dylang的模块 – shortid :

 var shortid = require('shortid'); var server = net.createServer(); server.on('connection', function(conn) { conn.id = shortid.generate(); conn.on('data', function(data) { conn.write('ID: '+conn.id); }); }); server.listen(3000); 

所以在这种情况下,你可以确定不会发生id重复。

在c + +来识别一个套接字,我们可以做一些事情,像写一个主要的套接字说服务器来侦听新的连接,然后相应地处理这些连接。但到目前为止,我还没有在node.js中find类似的东西。 (berkeley套接字模型)它是否甚至存在于node.js ..如果不是我回到我的C ++:$

您应该回头看看,因为JavaScript是基于原型的,面向对象的脚本语言,它是dynamic的,弱types的,并且具有一stream的function。 他们都是完全不同的语言,你将不得不有不同的思想来编写干净的JavaScript代码。

https://github.com/LearnBoost/Socket.IO/wiki/Migrating-0.6-to-0.7

会话ID

如果您在v0.6中使用了socket的sessionId属性,那么现在就是.id。

 // v0.6.x var sid = socket.sessionId; // v0.7.x var sid = socket.id; 

嗯,我真的不明白你在找什么,但是使用node.js(和socket.io)的socket编程是非常简单的。 看看socket.io主页上的一些例子:

 // note, io.listen() will create a http server for you var io = require('socket.io').listen(80); io.sockets.on('connection', function (socket) { io.sockets.emit('this', { will: 'be received by everyone connected'}); socket.on('private message', function (from, msg) { console.log('I received a private message by ', from, ' saying ', msg); }); socket.on('disconnect', function () { sockets.emit('user disconnected'); }); }); 

在连接到服务器时,每个套接字都会得到一个唯一的标识,稍后您可以标识它。

希望这可以帮助!? 干杯

如果你通过查找socket.io唯一id来发现这个问题,你可以使用它来区分客户端的套接字(就像我一样),那么这里是一个非常简单的答案:

 var id = 0; //initial id value io.sockets.on('connection', function(socket) { var my_id = id; //my_id = value for this exact socket connection id++; //increment global id for further connnections socket.broadcast.emit("user_connected", "user with id " + my_id + "connected"); } 

在每个新的连接上, id在服务器端增加。 这保证了一个唯一的ID。
我使用这种方法找出广播来自客户端,并从并发套接字保存数据。

例如:

服务器端

 var my_coords = {x : 2, y : -5}; socket.broadcast.emit("user_position", {id: my_id, coord: my_coords}); 

客户端

 user = {}; socketio.on("user_position", function(data) { if(typeof user[data.id] === "undefined") user[data.id] = {}; user[data.id]["x"] = data.coord.x; user[data.id]["y"] = data.coord.y; }); 

如何根据套接字ID来识别客户端。 有用的私人消息和其他的东西。

使用socket.io v1.4.5

客户端:

 var socketclientid = "john"; //should be the unique login id var iosocket = io.connect("http://localhost:5000", {query: "name=john"}); var socketmsg = JSON.stringify({ type: "private messaging", to: "doe", message: "whats up!" }); iosocket.send(socketmsg); 

服务器端:

 io.on('connection', function(socket){ var sessionid = socket.id; var name = socket.handshake.query['name']; //store both data in json object and put in array or something socket.on('message', function(msg){ var thesessionid = socket.id; var name = ???? //do lookup in the user array using the sessionid console.log("Message receive from: " + name); var msgobject = JSON.parse(msg); var msgtype = msgobject.type; var msgto = msgobject.to; var themessage = msgobject.message; //do something with the msg //john want to send private msg to doe var doesocketid = ???? //use socket id lookup for msgto in the array //doe must be online //send to doe only if (msgtype == "private messaging") socket.to(doesocketid).emit('message', 'themessage'); });