2016-05-16 9 views
6

私は私のPHPアプリケーションにリアルタイムのプライベートメッセージングシステムのために取り組んでいます。私のコードはすべてのユーザーのために働いています。しかし、私はプライベートメッセージングシステムを1対1メッセージとして必要とします。私は私が必要なものをメッセージデータを取得することができ、セットアップノードとRedisの後Node.js、Socket.io、Redis in 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アプリケーションにうまく働いています。今私はプライベートまたは1対1のメッセージングシステムをセットアップしたいと思う。

私はユーザー名または電子メールまたは一意のsocketIDをユーザーに追加する必要があります。プライベートメッセージングのアイデアはもうありません。私はオンライン上で図を描こうとしましたが失敗しました。

**プライベートメッセージを自分のPHPアプリケーションにセットアップするにはどうすればよいですか? **変数の

答えて

5

基本初期化: -

は主に、フロントエンドから送信されたメッセージにしたい人に特定のユーザのユーザIDを送信MAP mapOfSocketIdToSocketの作ります。サーバでは、のソケットobejectがuseridにマップされていて、そのソケットでメッセージを送信します。ここでは、民間対多一または一対一の宿泊概念(もし2つだけのメンバー)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。すべてのユーザーが1つの場所でメッセージを送受信できるオープンチャットのようです。しかし、それは1対1のメッセージングシステムになると思われる。 – naf4me

2

socketIO名前空間を使用することをお勧めします。特定の通信「チャネル」からイベントを送信/送信することができます。ここで

は部屋&名前空間

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

乾杯

0

使用Pusherに関するsocketIOのドキュメントへのリンクです。追加コードなしでプライベートチャットを可能にするチャネルの使用方法を提供します。

1

特定のソケットIDを持つ人にメッセージを送信する可能性があります。すでにredisを使用しているので、ユーザーが参加したときにユーザーの詳細とソケットIDを赤い場所に保存し、メッセージを送信するたびにソケットIDを赤い場所から取得してユーザーにメッセージを送信できます。

socket.emit( 'プライベート送信')フロントエンドから

などのイベントを呼び出して、バックエンドで

socket.on( 'プライベート送信'){// が、この内のRedisのものを行うに対処}

関連する問題