Как однозначно идентифицировать сокет с Node.js - PullRequest
16 голосов
/ 24 июля 2011

TLDR;Как идентифицировать сокеты в модели программирования, основанной на событиях.

Я только начинаю работать с node.js, в прошлом я делал большую часть своей части программирования на сокетах C ++ и PHP (), так что node.js - это нечточрезвычайно новый для меня.

В c ++ для идентификации сокета мы могли бы сделать что-то вроде написания основного сокета, скажем, сервера, для прослушивания новых соединений и изменений, а затем соответствующей обработки этих соединений.

Ответы [ 6 ]

20 голосов
/ 24 июля 2011

Если вы ищете реальные сокеты, а не 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);
12 голосов
/ 17 июня 2013

Подход Тимоти хорош, единственное, что нужно упомянуть - Math.random () может вызвать дублирование id.Так что вероятность того, что он сгенерирует такое же случайное число, очень мала, но это может произойти.Поэтому я бы порекомендовал вам использовать модуль dylang - shorttid :

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);

Так что в этом случае вы можете быть уверены, что дублирование идентификаторов не произойдет.

1 голос
/ 16 ноября 2016

Как идентифицировать клиента по его идентификатору сокета.Полезно для личных сообщений и прочего.

Использование 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');

});
1 голос
/ 20 марта 2015

если вы нашли этот вопрос, ища 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;
});
1 голос
/ 24 июля 2011

В c ++ для идентификации сокета мы могли бы сделать что-то вроде написания основной сокет, скажем, сервер для прослушивания новых подключений, а затем обрабатывать эти соединения соответственно. но пока я не нашел что-нибудь подобное в node.js. (модель сокета Беркли) даже существует в node.js .. если нет, я возвращаюсь к своему C ++: $

Вы должны вернуться, потому что JavaScript - это объектно-ориентированный язык сценариев на основе прототипов, который динамичен, слабо типизирован и имеет первоклассные функции. Они оба совершенно разные языки, и вы будете иметь иметь другое мышление для написания чистого кода JavaScript.

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

ID сеанса

Если вы использовали свойство sessionId сокета в v0.6, теперь это просто .id.

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

// v0.7.x
var sid = socket.id;
1 голос
/ 24 июля 2011

мммм, я не совсем понимаю, что вы ищете, но программирование сокетов с помощью 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');
  });
});

при подключении к серверу каждый сокет получает уникальный идентификатор, по которому его можно будет идентифицировать позже.

надеюсь, это поможет !? ура

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...