我想使用php在nodeJs + MYSQL中构建一个聊天系统。这将是一对一的私人聊天,并将在数据库中保存聊天。任何人都知道我需要从哪里开始。
目前我收到了SERVER的这段代码:
var app = require('express').createServer()
var io = require('socket.io').listen(app);
app.listen(8181);
// routing
app.get('/', function (req, res) {
res.sendfile(__dirname + '/index.html');
});
// usernames which are currently connected to the chat
var usernames = {};
io.sockets.on('connection', function (socket) {
// when the client emits 'sendchat', this listens and executes
socket.on('sendchat', function (data) {
// we tell the client to execute 'updatechat' with 2 parameters
io.sockets.emit('updatechat', socket.username, data);
});
// when the client emits 'adduser', this listens and executes
socket.on('adduser', function(username){
// we store the username in the socket session for this client
socket.username = username;
// add the client's username to the global list
usernames[username] = username;
// echo to client they've connected
socket.emit('updatechat', 'SERVER', 'you have connected');
// echo globally (all clients) that a person has connected
socket.broadcast.emit('updatechat', 'SERVER', username + ' has connected');
// update the list of users in chat, client-side
io.sockets.emit('updateusers', usernames);
});
// when the user disconnects.. perform this
socket.on('disconnect', function(){
// remove the username from global usernames list
delete usernames[socket.username];
// update list of users in chat, client-side
io.sockets.emit('updateusers', usernames);
// echo globally that this client has left
socket.broadcast.emit('updatechat', 'SERVER', socket.username + ' has disconnected');
});
})
答案 0 :(得分:4)
有两种方法。您可以保存对数组中所有套接字的引用(至少是这些套接字的ID)。当用户发出私人消息时,您在数组中搜索目标套接字并将其发送到此特定的套接字。这需要保存某种套接字的ID。您可以使用内部socket.id
,但在客户端重新连接(生成新ID)时会出现问题。当您的应用程序在多台计算机上工作时,还有另一个问题(它们无法共享已连接客户端的阵列)。
第二种方式是使用房间。每当客户连接时,我认为他有一个名字,例如约翰。然后你可以使用这样的东西进行连接:
socket.join('/priv/'+name);
现在,这会创建一个房间,并为其添加socket
。如果您想向John发送消息,那么您只需使用
io.sockets.in('/priv/John').emit('msg', data);
此时您可以确定该消息正好发送到/priv/John
房间的套接字。这与Redis结合socket.io(以避免许多机器问题)和会话授权完美配合。我没有尝试使用memoryStore,但它应该也能正常工作。
当客户断开连接时,您也不必担心房间。 Socket.io会自动摧毁空房间。