Я делаю простое приложение для чата, которое отправляет сообщения через канал публикации/подписки redis. Я не использую никаких параметров входа, просто позволяю пользователю выбрать имя пользователя и чат. Я пытаюсь реализовать приватный чат, в котором один клиент может общаться с другим клиентом подключения. Я новичок в программировании чат-клиента, я пытаюсь понять, как общаться только с одним клиентом. Какие варианты я могу рассмотреть, чтобы получить возможность общаться один на один? Я не против изменить свою архитектуру, чтобы включить новый инструмент. Любые предложения приветствуются
Подключение к определенным клиентам в приложении чата
Ответы (2)
Я сделал что-то подобное с необработанными сокетами. Я держал пользовательские объекты, которые содержали подключенный сокет, имя и общались ли они. Если пользователь не в чате, он может ввести команду /list users
, которая выводит список подключенных пользователей. Когда он нашел кого-то, с кем можно поболтать, он вводит команду /chat bob
. Если пользователь bob
уже находится в чате, он получит сообщение от сервера о том, что bob is in a chat already
. В противном случае между двумя пользователями будет установлен сеанс чата. Теперь они будут в чате, пока один из них не введет /endchat
. Тогда они смогут найти новых людей для общения.
Хитрость заключается в реализации сервера, чтобы он мог отслеживать список пользователей и их статус в чате, а также с кем они общаются, поэтому, когда они набирают /endchat
, другой пользователь может быть уведомлен.
Я полагаю, что комбинация Nodejs + Socket.io решит вашу проблему. В частности, функциональность номеров — это то, что вам здесь нужно.
Допустим, у вас есть два пользователя bob и gob. Учитывая, что оба находятся в сети (хотя вы можете добавить Redis в качестве хранилища сеансов и для хранения истории позже, что я и сделал в моем случае). Скажем, Боб хочет поболтать с Джобом, он выбирает Гоба. Теперь заставьте Боба присоединиться к комнате, используя
var roomname = 'bob'>'gob'?'bob'+'gob':'gob'+'bob' ;
//this type of naming ensures roomname is same for both users
socket.join(roomname);
Это сработает, только если оба выбрали друг друга. Итак, теперь, когда гоб выбирает боба, они оба соединяются в одной комнате. Всякий раз, когда кто-то отправляет сообщение, заставьте его излучать в эту комнату, используя
socket.broadcast.to(roomname).emit('message_event',msgObj);
Убедитесь, что вы добавили прослушиватель
socket.on('message_event',messageHandler);
Когда чат закончен, заставьте их покинуть комнату, используя
socket.leave(roomname);