Подтвердить что ты не робот

Как однозначно идентифицировать сокет с Node.js

TL;DR; Как определить сокеты в модели программирования на основе событий.

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

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

4b9b3361

Ответ 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');

});