Nano Hash - криптовалюты, майнинг, программирование

подключение к сокету в узле js

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

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

где k - идентификатор сокета ранее подключенного того же пользователя

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


Ответы:


1

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

    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/) и создайте одну комнату для каждого клиента или одну комнату для группы клиентов. Для этого взгляните на этот ответ: ">Использование Socket.io с несколькими клиентами, подключающимися к одному серверу

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

Удачи!

27.09.2016
  • Мой вопрос точно для разных браузеров или компьютеров. Что происходит, когда пользователь входит в систему с нескольких компьютеров или может быть из разных браузеров. 27.09.2016
  • Различные браузеры или разные компьютеры (если у вас нет реализации комнаты/пространства имен) будут такими же, как и иметь много вкладок. Сокет будет включен, скажем, someIp:somePort, например. 98.45.32.21:3000, это не меняется, поэтому, когда кто-то отправляет приветствие, сервер будет отвечать всем приветствием (в приведенной выше реализации). 27.09.2016
  • Если вы хотите, чтобы пользователь входил в систему из двух разных браузеров и видел одни и те же сообщения, но только свои сообщения, то вы должны соотнести этого пользователя с правильной комнатой, чтобы, когда он подключается из второго браузера, вы знали, что это пользователь sagar , вы присоединитесь к нему в нужной комнате. 27.09.2016

  • 2

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

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

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

    socket.room = roomname
    socket.join(roomname)
    

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

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

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

    Надеюсь это поможет!

    27.09.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..