我正在开发一个基于文本的在线角色扮演游戏(Github);目前我有一个PHP后端,它将会话数据存储在redis服务器中。对于需要实时通信的所有内容(聊天,消息和连接用户列表),我使用Node.js和socket.io作为websockets。
我的websocket服务器上目前有3个名称空间:
我已经成功了,但我担心其中大部分是由“黑客”造成的。现在我有问题向特定客户发送消息。例如,如果我正在向另一个用户写一条私信,当我点击“发送”时,我想要以下逻辑。
{"sender": 15, "message": "blablabla", "receiver": 17};
在websocket服务器上,服务器获取事件,并从那里我必须将“接收器”与客户端会话对齐。在每个与命名空间的连接中,我向套接字对象添加了两个属性,accountId和accountName,它们是我的Auth模块的结果。
/* 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();
}
});
}
});
如何在不使用内置socket.id的情况下仅向特定客户端发出事件?
答案 0 :(得分:0)
您可以尝试节点的“socket-io-emitter”模块。
var io = require('socket.io-emitter')({
host: redisHost,
port: redisPort
});
然后通过用户特定的密钥发送给某个用户:
io.to('myKey' + '_user_' + userId).emit('myEvent', {
data: 'hello'
});