socket.io,使用PHP会话作为socket.id和redis

时间:2016-11-04 08:36:23

标签: javascript node.js websocket redis socket.io

我正在开发一个基于文本的在线角色扮演游戏(Github);目前我有一个PHP后端,它将会话数据存储在redis服务器中。对于需要实时通信的所有内容(聊天,消息和连接用户列表),我使用Node.js和socket.io作为websockets。

我的websocket服务器上目前有3个名称空间:

  1. Messaging Server
  2. 在线服务器
  3. 聊天服务器
  4. 我已经成功了,但我担心其中大部分是由“黑客”造成的。现在我有问题向特定客户发送消息。例如,如果我正在向另一个用户写一条私信,当我点击“发送”时,我想要以下逻辑。

    1. 用户正在撰写他的消息,当他点击“发送”客户端发送到websocket服务器时,如{"sender": 15, "message": "blablabla", "receiver": 17};
    2. 在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(); } }); } });

    3. 如何在不使用内置socket.id的情况下仅向特定客户端发出事件?

1 个答案:

答案 0 :(得分:0)

您可以尝试节点的“socket-io-emitter”模块。

var io = require('socket.io-emitter')({
  host: redisHost,
  port: redisPort
});

然后通过用户特定的密钥发送给某个用户:

io.to('myKey' + '_user_' + userId).emit('myEvent', {
  data: 'hello'
});