Как однозначно идентифицировать сокет с Node.js
TL;DR; Как определить сокеты в модели программирования на основе событий.
Я только начинаю с node.js, в прошлом я проделал большую часть своего кодирования
часть в С++ и PHP сокеты(), поэтому node.js - это что-то очень новое для меня.
В С++ для идентификации сокета мы могли бы сделать что-то вроде написания основного сокета, говорящего на сервере, чтобы прослушивать новые подключения и изменения, а затем соответствующим образом обрабатывать эти соединения.
Ответы
Ответ 1
Если вы ищете фактические сокеты, а не 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);
Ответ 2
Тимоти подход хорош, единственное, что можно упомянуть - 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 не произойдет.
Ответ 3
mmmm, я действительно не получаю то, что вы ищете, но сокет-программирование с node.js(и socket.io) действительно прямолинейно. взгляните на некоторые примеры на странице 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');
});
});
при подключении к серверу каждый сокет получает уникальный идентификатор, с которым вы позже можете его идентифицировать.
надеюсь, что это поможет!?
приветствия
Ответ 4
В С++ для идентификации сокета мы могли бы сделать что-то вроде написания основной разъем говорит серверу для прослушивания новых подключений, а затем обрабатывая эти соединения соответственно. Но пока я не нашел ничего подобного в node.js. (модель гнезда berkeley). Это даже существуют в node.js.. если нет, я возвращаюсь к своему С++: $
Вы должны вернуться, потому что JavaScript - это прототип, объектно-ориентированный язык сценариев, который является динамическим, слабо типизированным и имеет первоклассные функции. Они оба совершенно разные языки, и для написания чистого кода JavaScript вам потребуется другое мышление.
https://github.com/LearnBoost/Socket.IO/wiki/Migrating-0.6-to-0.7
Идентификатор сеанса
Если вы использовали свойство sessionId сокета в v0.6, теперь это просто .id.
// v0.6.x
var sid = socket.sessionId;
// v0.7.x
var sid = socket.id;
Ответ 5
если вы нашли этот вопрос, ища socket.io
уникальные идентификаторы, которые вы можете использовать для различения сокетов на стороне клиента (как и я), тогда вот очень простой ответ:
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;
});
Ответ 6
Как идентифицировать клиента на основе его идентификатора сокета. Полезно для личных сообщений и других вещей.
Использование 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');
});