8

我正在为我的 php 应用程序中的实时私人消息传递系统工作。我的代码适用于所有用户。但我需要私人消息系统作为一对一消息。

在设置节点和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 应用程序中运行良好。现在我想建立私人或一对一的消息系统。

我需要为用户添加用户名或电子邮件或唯一 socketID 的方式。我对私人消息没有更多的想法。我试图在网上计算,但失败了。

**如何在我的 php 应用程序中设置私人消息?**

4

4 回答 4

6

变量的基本初始化:-

首先,制作mapOfSocketIdToSocket的MAP,然后从前端发送您要向其发送消息的特定用户的用户 ID。在服务器中,找到与用户 ID 映射的套接字对象,并在该套接字中发出您的消息。这是这个想法的一个示例(不是完整的代码)

  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-聊天室-with/

于 2016-05-16T15:53:44.803 回答
3

我建议你使用 socketIO 命名空间,它允许你从/到特定的通信“通道”发送/发射事件。

这是有关房间和命名空间的 socketIO 文档的链接

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

干杯

于 2016-05-25T10:36:59.740 回答
1

一种解决方案可能是将消息发送给具有特定套接字 id 的人。由于您已经在使用 redis,您可以在用户加入时将用户的详细信息和套接字 id 存储在 redis 中,然后在您想向他发送消息时通过从 redis 获取套接字 id 向用户发送消息。调用事件如

socket.emit('send private') 从前端

并在后端处理

socket.on('send private'){ // 在这个里面做 redis 的东西 }

于 2016-05-29T01:08:04.123 回答
0

使用推杆。它提供频道使用,无需任何额外代码即可进行私人聊天

于 2016-05-27T08:30:00.767 回答