2016-09-27 4 views
0

Я только начал работать над узлом js.I пытался создать чат-приложение с помощью узла js. В котором один пользователь может войти в систему через несколько устройств или браузеров. Если я не ошибаюсь, и, насколько я понимаю, каждый из браузеров взаимодействует с другим адресом порта, поскольку сокет-соединение определяется IP-адресом и адресом порта, поэтому, когда один и тот же пользователь входит в систему с двух разных серверов браузеров, создается два разных идентификатора сокета. Теперь я проверяю если пользователь уже подключен, проверив параметр send to socket info. Затем, если пользователь уже подключен или сокет уже настроен для пользователя, я создаю соединение для изменения идентификатора сокета на предыдущий идентификатор сокета.соединение сокета в узле js

io.on('connection', function(socket){ 
socket.id = k; 
}); 

где к сокет идентификатор ранее присоединенной же пользователем

Теперь, когда любой другой клиент выдает сообщение для текущего пользователя затем сокет идентификатор заменяется и только один браузер получает сообщение или оба из них получает сообщение. Соединение сервера установлено как для браузера, так и для одного браузера. Пожалуйста, помогите мне в этом. Я все еще не понимаю, как устанавливается соединение сокета между клиентом и сервером. Пожалуйста, улучшитесь, если я ошибаюсь, или как решить следующее scenerio. Заранее спасибо

ответ

2

Если я правильно понимаю вашу проблему, позвольте мне попытаться объяснить на моем пути. Допустим, у вас есть следующий код для сервера:

var io = require('socket.io')(somePort); //same port for the client to connect, e.g. 3000 
    io.on('connection', function(socket){ 
    // in here you should define any actions on your primary socket 
    // for example: 
     socket.on("hello", function(dataUserSendsWithTopicHello){// overly long variable name to show my point! :) 
     // do something with hello data 
     }); 

    // this will go to anyone who is connected and has a handler like above for "hello" 
     socket.emit("hello", "hello to all who listen to hello topic"); 
    }); 

Соответствующий клиент будет:

var socket = io.connect('ip:port'); // e.g. localhost:3000 - same ip and port as above 

    socket.on('hello', function(serverResponseToHello){ 
    // do something when server sends back something on hello 
    }); 

// send a hello to the server 
    socket.emit("hello", "Sending hello to server"); 

Теперь, если вы хотите, чтобы ответить только один пользователя, или группу из чтобы увидеть какое-то сообщение вместе, как в чате, вы могли бы использовать реализацию пространства/пространства имен socket.io (http://socket.io/docs/rooms-and-namespaces/) и создать одну комнату для каждого клиента или одну комнату для группы клиентов. Для этого взгляните на этот ответ: Using Socket.io with multiple clients connecting to same server

Чтобы подвести итог, есть один ip и один порт. Каждый слушает этот ip и порт, и если вы откроете три вкладки, и у вас есть такая реализация, как выше, все вкладки будут слушать «привет». Используя комнаты, вы можете группировать своих пользователей и изолировать общение, чтобы только пользователи, которые делают связь между правильными пользователями и не всеми.

Удачи вам!

+0

Мой вопрос точно для разных браузеров или компьютеров. Что происходит, когда пользователь входит в систему с нескольких компьютеров или может быть разными браузерами. –

+0

Различные браузеры или разные компьютеры (если у вас нет реализации пространства/пространства имен) будут такими же, как и для многих вкладок. Сокет будет включен, скажем, 'someIp: somePort', например. '98.45.32.21: 3000', который не изменяется, поэтому при отправке сервера« привет »ответит всем приветствие (в приведенной выше реализации). – mkaran

+0

Если вы хотите, чтобы пользователь входил в систему из двух разных браузеров и просматривал одни и те же сообщения - но только его сообщения, то вы должны сопоставить этого пользователя с правильной комнатой, чтобы при подключении со второго браузера, и вы знаете, что это пользователь 'sagar', вы присоединитесь к нему в правильной комнате. – mkaran

0

Я тоже довольно новичок в Sockets (и JS), и я тоже пытаюсь сделать чат-приложение, но немного по-другому.

Насколько я понимаю, сообщение будет получено только в одном браузере. Лучшим вариантом было бы позволить пользователю подключаться через несколько браузеров/устройств. Вы можете сохранить список всех сокетов, с которыми пользователь подключился (если вам это нужно).

Если вам нужен индивидуальный чат, возможно, вы можете написать код, в котором все сокеты, из которых два пользователя подключаются, объединены в одну комнату.

socket.room = roomname 
socket.join(roomname) 

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

socket.to(socket.room).broadcast.emit("message", message); 

(я коплю информацию номера в розетке, не идеи, если это не хороший дизайн)

Надеется, что это помогает!

Смежные вопросы