Подключение к определенным клиентам в приложении чата

Я делаю простое приложение для чата, которое отправляет сообщения через канал публикации/подписки redis. Я не использую никаких параметров входа, просто позволяю пользователю выбрать имя пользователя и чат. Я пытаюсь реализовать приватный чат, в котором один клиент может общаться с другим клиентом подключения. Я новичок в программировании чат-клиента, я пытаюсь понять, как общаться только с одним клиентом. Какие варианты я могу рассмотреть, чтобы получить возможность общаться один на один? Я не против изменить свою архитектуру, чтобы включить новый инструмент. Любые предложения приветствуются


person Rajesh K    schedule 24.07.2015    source источник


Ответы (2)


Я сделал что-то подобное с необработанными сокетами. Я держал пользовательские объекты, которые содержали подключенный сокет, имя и общались ли они. Если пользователь не в чате, он может ввести команду /list users, которая выводит список подключенных пользователей. Когда он нашел кого-то, с кем можно поболтать, он вводит команду /chat bob. Если пользователь bob уже находится в чате, он получит сообщение от сервера о том, что bob is in a chat already. В противном случае между двумя пользователями будет установлен сеанс чата. Теперь они будут в чате, пока один из них не введет /endchat. Тогда они смогут найти новых людей для общения.

Хитрость заключается в реализации сервера, чтобы он мог отслеживать список пользователей и их статус в чате, а также с кем они общаются, поэтому, когда они набирают /endchat, другой пользователь может быть уведомлен.

person Chol Nhial    schedule 24.07.2015
comment
Спасибо, я думаю, что эта концепция работает. Мне было интересно, как вы создали пользовательский объект и как получить сокет для отправки от одного пользователя к другому? Кроме того, я искал Ratchet, но я не уверен, как реализовать redis pubsub с храповым механизмом. Мне нужно использовать подписку Redis для получения сообщений. Вот что удерживало меня от храповика - person Rajesh K; 24.07.2015
comment
Я могу перечислить имена пользователей, подключенных в данный момент. Где я застрял, так это в том, что когда вы говорите /chat bob, как вы отправляете это сообщение только bob, а не всем подключенным? - person Rajesh K; 24.07.2015

Я полагаю, что комбинация 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);
person stoic65    schedule 26.07.2015