2016-05-16 4 views
6

Ich arbeite für ein Echtzeit-Messaging-System in meiner PHP-Anwendung. Meine Codes arbeiten für alle Benutzer zusammen. Aber ich brauche privates Nachrichtensystem als Eins-zu-Eins-Nachricht.Private Chat Messaging mit Node.js, Socket.io, Redis in PHP

Nach dem Setup-Knoten und redis ich die Nachrichtendaten bekommen, was ich brauche: hier ist der Code ::

Front-end :: 1. ich ein Formular für - Benutzername, Nachricht und senden JS Taste

und Benachrichtigung:

$(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>"); 

    }); 

}); 

Server Side 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> 

Over-all-Ausgang:

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

Above-Codes arbeiten gut in meine PHP-Anwendung. Jetzt möchte ich private oder eins-zu-eins-Messaging-System einrichten.

Die Art, wie ich Benutzername oder E-Mail oder einzigartige SocketID für Benutzer hinzufügen muss. Ich habe keine Ideen mehr für private Nachrichten. Ich habe versucht, online zu sehen, aber gescheitert.

** Wie konfiguriere ich private Nachricht in meine PHP-Anwendung? **

Antwort

5

Grund Initialisierung von Variablen: -

Meist MAP von mapOfSocketIdToSocket dann senden die Benutzer-ID des jeweiligen Benutzers machen, die Sie von dem Front-End gesendeten Mitteilung. Im Server finden Sie die Socket obeject zugeordnet mit der Benutzer-ID und emittieren Sie Ihre Nachricht in diesem Sockel. Hier ist ein Beispiel von der Idee (nicht der vollständige Code)

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); 
     } 
    } 
    }) 

Entweder Sie können für Raumkonzepte für private one-to-many oder Eins-zu-eins (wenn nur zwei Mitglieder) http://williammora.com/nodejs-tutorial-building-chatroom-with/

hinwollen
+0

Beispiel App: http://justchatnow.herokuapp.com/ und Quellcode https://github.com/codebazz/justchatnow –

+0

:: es funktioniert nicht im privaten Messaging. Ich denke, ich vermisse etwas. Würden Sie mich bitte etwas mehr als Server-Seite und Client-Seite mit Redis-Client führen? –

+0

@Md. Sariful islam Es scheint offene Chat-Box, wo alle Benutzer können Nachrichten an einem Ort senden und empfangen. Aber es scheint, es wäre eins zu eins Messaging-System. – naf4me

2

Ich würde vorschlagen, dass Sie socketIO Namespaces verwenden, es ermöglicht Ihnen das Senden/Auslösen von Ereignissen von/zu bestimmten Kommunikations- "Kanälen". Hier

ist der Link zu socketIO Dokumentation über Zimmer & Namespaces

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

Prost

0

Verwenden Pusher.Es bietet Kanalverwendung, um private Chats ohne zusätzlichen Code zu ermöglichen

1

Eine Lösung könnte das Senden von Nachrichten an eine Person mit der jeweiligen Socket-ID sein. Da Sie redis bereits verwenden, können Sie die Benutzerdetails und die Socket-ID in redis speichern, wenn Benutzer beitreten, und dann Nachrichten an den Benutzer senden, indem Sie die Socket-ID von Redis holen, wenn Sie ihm eine Nachricht senden möchten. Rufereignissen wie

socket.emit ('send private') von Front-End

und Back-End-Griff der

socket.on ('Privat senden') {// tun redis Zeug in dieser }