Частные сообщения чата с использованием Node.js, Socket.io, Redis в переполнении стека

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

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

Внешний интерфейс ::
1. Я использую форму для — имя пользователя, сообщение и кнопку отправки

и уведомление JS:

$( document ).ready(function() {

var socket = io.connect('http://192.168.2.111:8890');

socket.on('notification', function (data) {
var message = JSON.parse(data);
$( "#notifications" ).prepend("<p> <strong> " + message.user_name + "</strong>: " + message.message + "</p>" );

});

});

Серверная часть js:

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var redis = require('redis');

server.listen(8890);

var users = {};
var sockets = {};

io.on('connection', function (socket) {

console.log(" New User Connected ");
// instance of Redis Client
var redisClient = redis.createClient();
redisClient.subscribe('notification');

socket.on('set nickname', function (name) {
socket.set('nickname', name, function () {
socket.emit('ready');
});
});

socket.on('msg', function () {
socket.get('nickname', function (err, name) {
console.log('Chat message by ', name);
});
});redisClient.on("message", function(channel, message)
{
// to view into terminal for monitoring
console.log("Message from: " + message + ". In channel: " + channel + ". Socket ID "+ socket.id );

//send to socket
socket.emit(channel, message);
});

redisClient.on('update_chatter_count', function(data)
{
socket.emit('count_chatters', data);
});

//close redis
socket.on('disconnect', function()
{
redisClient.quit();
});

});

HTML ::

<script src="https://cdn.socket.io/socket.io-1.3.5.js"></script>
<form .....>
<input ....... >
</form>
<div id="notifications" ></div>

Общий выход:

John : Hello
Kate : Hi
Others: .....

Выше коды работают хорошо в моем приложении PHP. Теперь я хочу настроить частную систему обмена сообщениями.

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

** Как мне настроить личное сообщение в моем приложении php? **

6

Решение

Базовая инициализация переменных: —

В основном делают КАРТА из mapOfSocketIdToSocket затем отправьте идентификатор пользователя определенного пользователя, которому вы хотите отправить сообщение из внешнего интерфейса. На сервере найдите сокет объект сопоставляется с идентификатором пользователя и отправляет ваше сообщение в этот сокет. Вот пример идеи (не полный код)

  var io = socketio.listen(server);
var connectedCount = 0;
var clients = [];
var socketList = [];
var socketInfo = {};
var mapOfSocketIdToSocket={};

socket.on('connectionInitiation', function (user) {
io.sockets.sockets['socketID'] = socket.id;
socketInfo = {};
socketInfo['userId']=user.userId;
socketInfo['connectTime'] = new Date();
socketInfo['socketId'] = socket.id;
socketList.push(socketInfo);

socket.nickname = user.name;
socket.userId= user.userId;

loggjs.debug("<"+ user.name + "> is just connected!!");

clients.push(user.userId);
mapOfSocketIdToSocket[socket.id]=socket;
}
socket.on('messageFromClient', function (cMessageObj, callback) {
for(var i=0; i<socketList.length;i++){
if(socketList[i]['userId']==cMessageObj['messageToUserID']){ // if user is online
mapOfSocketIdToSocket[socketList[i]['socketId']].emit('clientToClientMessage', {sMessageObj: cMessageObj});
loggjs.debug(cMessageObj);
}
}
})

Либо вы, возможно, захотите использовать концепцию помещения для личного «один ко многим» или «один к одному» (если только два участника) http://williammora.com/nodejs-tutorial-building-chatroom-with/

5

Другие решения

Я бы посоветовал вам использовать пространства имен socketIO, это позволит вам отправлять / отправлять события с / на определенные коммуникационные «каналы».

Вот ссылка на socketIO документацию по комнатам & Пространства имен

http://socket.io/docs/rooms-and-namespaces/

ура

2

Одним из решений может быть отправка сообщений человеку с определенным идентификатором сокета. Поскольку вы уже используете redis, вы можете сохранить данные пользователя и идентификатор сокета в redis, когда пользователь присоединяется, а затем отправлять сообщения пользователю, получая идентификатор сокета из redis всякий раз, когда вы хотите отправить ему сообщение. Назовите события как

socket.emit (‘send private’) из внешнего интерфейса

и на бэкэнд обработать

socket.on (‘отправить личное’) {
// делать вещи заново в этом}

1

использование толкатель. Он предлагает использование канала, чтобы сделать частные чаты возможными без дополнительного кода

0
По вопросам рекламы [email protected]