2016-11-04 3 views
0

私はオンラインのテキストベースのRPG(Github)を開発中です。私は現在、セッションデータをRedisサーバーに保存するPHPバックエンドを持っています。リアルタイムコミュニケーションが必要なすべてのもの(チャット、メッセージング、接続されたユーザのリスト)では、私はNode.jsとsocket.ioをWebソケット用に使います。socket.io、redisでsocket.idとしてPHPセッションを使用

私は私のWebSocketサーバ上で現在3名前空間を持っている:

  1. メッセージングサーバー
  2. オンラインサーバー
  3. チャットサーバー

私はそれが仕事作ったが、私は怖いですそのほとんどは「ハッキング」から作られています。今、私は特定のクライアントにメッセージを送信するのに問題があります。たとえば、別のユーザーに私的なメッセージを書いている場合、「送信」をクリックすると、次のロジックが必要になります。

  1. 彼は、クライアントがWebSocketのサーバーへのWebSocketサーバーで{"sender": 15, "message": "blablabla", "receiver": 17};
  2. のようなものを放出し、サーバーがイベントを取得し、そこから私は揃える必要があり、「送信」をクリックすると、ユーザーは、彼のメッセージを書いています"レシーバ"とクライアントセッション。名前空間への接続ごとに、私はAuthモジュールの結果であるaccountIdとaccountNameという2つのプロパティをソケットオブジェクトに追加します。私はビルトインsocket.idを使用せずに、特定のクライアントにイベントを発することができる方法

    /* POSTA SERVER */ postaServer.on('connection', function postaConnect(socket) { var phpSessId = cookie.parse(socket.request.headers.cookie) .PHPSESSID; if (phpSessId === undefined || phpSessId === '') { console.log('Sessione non trovata'); socket.disconnect(); } else { // modulo socket_auth checkSession(phpSessId, function (auth) { if (auth) { // Auth retrieves account id and account name from redis socket.accountId = auth.id; socket.accountName = auth.nome; socket.emit('serverMessage', 'connesso al server di posta'); var conn = mysql.createConnection(DB); getMessaggiPosta(socket.accountId, conn, function (err, result) { if (err) { console.log(err); } else { socket.emit('refreshPosta', result); } }); } else { socket.disconnect(); } }); } });

答えて

0

nodeの "socket-io-emitter"モジュールを試すことができます。

var io = require('socket.io-emitter')({ 
    host: redisHost, 
    port: redisPort 
}); 

そしてユーザ特定キーを介して特定のユーザに発する:

io.to('myKey' + '_user_' + userId).emit('myEvent', { 
    data: 'hello' 
}); 
関連する問題