我正在为我的PHP应用程序中的一个实时私人消息系统工作.我的代码一起为所有用户服务.但我需要私人消息系统作为一对一的消息.
在设置节点和redis后,我可以得到我需要的消息数据:这里是代码::@H_404_3@
前端 ::
1.我使用表格 – 用户名,信息和发送按钮@H_404_3@
- $( 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:@H_404_3@
- 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 ::@H_404_3@
- <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应用程序中运行良好.现在我想建立私人或一对一的消息系统.@H_404_3@
我需要为用户添加用户名或电子邮件或唯一套接字ID的方式.我对私人消息没有更多的想法.我试图在网上找到但却失败了.@H_404_3@
解决方法
变量的基本初始化: –
通常使mapOfSocketIdToSocket的MAP发送您要从前端发送消息的特定用户的用户ID.在服务器中找到与userid映射的套接字obeject,并在该套接字中发出消息.以下是该想法的示例(不是完整代码)@H_404_3@
- 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/@H_404_3@