TLDR;如何在基于事件的编程模型中识别套接字。
我刚刚开始使用node.js,过去我完成了大部分编码工作 部分在C ++和PHP套接字()中,所以node.js对我来说是一个非常新的东西。
在c ++中识别套接字,我们可以做一些事情,比如写一个主套接字,说服务器来监听新的连接和更改,然后相应地处理这些连接。
答案 0 :(得分:20)
如果您正在寻找实际的套接字而不是socket.io,它们确实存在。
但如上所述,Node.js和Javascript使用基于事件的编程模型,因此您创建一个(TCP)套接字,侦听IP:端口(类似于bind),然后接受传递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);
答案 1 :(得分:12)
Timothy的方法很好,唯一要提的是 - Math.random()可能会导致id的重复。因此它产生相同随机数的几率非常小,但它可能会发生。所以我建议你使用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重复。
答案 2 :(得分:1)
毫米,我真的没有得到你想要的东西但是用node.js(和socket.io)进行套接字编程真的很简单。看一下socket.io homepage上的一些例子:
// 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');
});
});
在连接到服务器时,每个套接字都会获得一个唯一的ID,您可以在以后识别它。
希望这有帮助!? 欢呼声答案 3 :(得分:1)
在c ++中识别套接字,我们可以做类似的写作 主套接字说服务器侦听新连接然后 相应地处理这些连接。但到目前为止我还没有找到 在node.js中有类似的东西。 (伯克利插座型号)是吗? 甚至存在于node.js ..如果不是我回到我的C ++:$
你应该回去,因为JavaScript is a prototype-based, object-oriented scripting language that is dynamic, weakly typed and has first-class functions.他们都是完全不同的语言,你必须有不同的心态来编写干净的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;
答案 4 :(得分:1)
如果您通过查找可用于区分客户端套接字的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
在服务器端增加。这保证了一个独特的身份
我使用这种方法来查找客户端广播的来源以及从并发套接字保存数据。
例如:
服务器侧强>
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;
});
答案 5 :(得分:1)
如何根据套接字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');
});
答案 6 :(得分:1)
打字稿中的
:import { v4 as uuidv4 } from 'uuid';
import net from 'net';
class Socket extends net.Socket {
id?: string;
}
const server = net.createServer();
server.on('connection', (conn) => {
conn.id = uuidv4();
conn.on('data', (data) => {
console.log(conn.id);
});
});
server.listen(3000);
您需要先添加id
;