在 PHP 中使用 Node.js、Socket.io、Redis 的私人聊天消息
Posted
技术标签:
【中文标题】在 PHP 中使用 Node.js、Socket.io、Redis 的私人聊天消息【英文标题】:Private Chat Messaging using Node.js, Socket.io, Redis in PHP 【发布时间】:2016-09-11 20:47:27 【问题描述】:我正在为我的 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 应用程序中设置私人消息? **
【问题讨论】:
【参考方案1】:变量的基本初始化:-
首先,制作 mapOfSocketIdToSocket 的 MAP,然后从前端发送您要向其发送消息的特定用户的用户 ID。在服务器中,找到与用户 ID 映射的 socket obeject 并在该套接字中发出您的消息。这是一个想法的示例(不是完整的代码)
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-chatroom-with/
【讨论】:
示例应用程序:justchatnow.herokuapp.com 和源代码github.com/codebazz/justchatnow :: 它在私人消息中不起作用。我想我错过了一些东西。能否请您多指导我一些使用 redis 客户端的服务器端和客户端? @Md. Sariful islam 似乎打开了聊天框,所有用户都可以在一个位置发送和接收消息。但它似乎是一对一的消息传递系统。 这不是直接的解决方案。我只是想帮助他一些想法。有人可以帮助他 @Md. Sariful islam :: 我可以进行公共聊天,但我需要将私人设置为一对一的消息传递系统。请你指导我吗?【参考方案2】:我建议你使用 socketIO 命名空间,它允许你从/到特定的通信“通道”发送/发射事件。
这里是关于房间和命名空间的 socketIO 文档的链接
http://socket.io/docs/rooms-and-namespaces/
干杯
【讨论】:
【参考方案3】:一种解决方案是向具有特定套接字 ID 的人发送消息。由于您已经在使用 redis,您可以在用户加入时将用户的详细信息和套接字 id 存储在 redis 中,然后在您想向他发送消息时通过从 redis 获取套接字 id 向用户发送消息。调用事件,如
socket.emit('send private') 从前端
在后端处理
socket.on('发送私有') // 在这个里面做 redis 的东西
【讨论】:
【参考方案4】:使用Pusher。它提供频道使用,无需任何额外代码即可进行私人聊天
【讨论】:
以上是关于在 PHP 中使用 Node.js、Socket.io、Redis 的私人聊天消息的主要内容,如果未能解决你的问题,请参考以下文章
Socket.io 无法在 nginx + node.js + php 应用程序中连接
Node.js + Socket IO + Apache + PHP 从 url 中删除端口?
使用 Redis 在 PHP 和 socket.io/node.js 之间进行通信