2016-05-16 89 views
6

我正在爲我的php應用程序實時的私人消息系統工作。我的代碼一起爲所有用戶工作。但我需要私人消息系統作爲一對一的消息。在PHP中使用Node.js,Socket.io,Redis的私人聊天消息

後設置節點和Redis的我能得到的消息數據我需要什麼:這裏是代碼::

前端:: 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應用程序中設置私人信息? **

回答

5

變量的基本初始化: -

晴使MAPmapOfSocketIdToSocket然後從前端發送特定用戶的用戶ID您要爲之發送的消息。在服務器中找到與用戶標識映射的套接字對象,並在該套接字中發送消息。以下是你可能需要去房概念私人一個一對多或一對一一個(如果只有兩個成員)http://williammora.com/nodejs-tutorial-building-chatroom-with/

想法的樣本(而不是完整的代碼)

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

無論是

+0

示例應用程序:http://justchatnow.herokuapp.com/和源代碼https://github.com/codebazz/justchatnow –

+0

::它不在私人消息傳遞。我想我錯過了一些東西。請您引導我多一點作爲服務器端和客戶端使用Redis客戶端? –

+0

@Md。 Sariful islam似乎開放的聊天框,所有用戶都可以在一個位置發送和接收消息。但它似乎是一對一的信息系統。 – naf4me

0

使用Pusher。它提供了通道使用,使私人聊天可能沒有任何額外的代碼

1

一個解決方案可能是發送消息給具有特定套接字ID的人。由於您已經在使用redis,因此您可以在用戶加入時將用戶的詳細信息和套接字標識存儲在redis中,並且只要您想向他發送消息,就可以通過從redis獲取套接字標識來向用戶發送消息。像

socket.emit呼叫事件( '發私')從前端

和後端處理

socket.on( '發私'){// 做Redis的東西,這裏面}