Свързване с конкретни клиенти в приложение за чат

Създавам просто приложение за чат, което изпраща съобщения през redis pub/sub канал. Не използвам никакви опции за влизане, просто позволявам на потребителя да избере потребителско име и да разговаря. Опитвам се да внедря частен чат, при който един клиент може да комуникира с друг клиент за свързване. Нов съм в програмирането на клиенти за чат, опитвам се да разбера как да комуникирам само с един клиент. Кои са някои от опциите, които бих могъл да обмисля, за да получа възможност за чат 1 на 1? Нямам нищо против да променя архитектурата си, за да включа нов инструмент. Всички предложения се оценяват


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 с Ratchet. Трябва да използвам redis subscribe, за да получавам съобщения. Това ме възпираше от тресчотка - 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);

Това ще работи само ако и двамата са избрали един друг. Така че сега, когато gob избере bob, и двамата се присъединяват в една и съща стая. Всеки път, когато някой изпрати съобщение, накарайте го да излъчва към тази стая, като използва

 socket.broadcast.to(roomname).emit('message_event',msgObj);

Уверете се, че сте добавили слушателя

 socket.on('message_event',messageHandler);

Когато чатът приключи, накарайте ги да напуснат стаята, като използвате

socket.leave(roomname);
person stoic65    schedule 26.07.2015