当前位置: 首页 > 知识库问答 >
问题:

socket.io私密消息(&I)

冯敏达
2023-03-14

这个问题肯定已经问过一千遍了,但是我没有找到任何一个令人满意的答案,所以我会尝试再问一遍,尽可能的清晰。

我从一辆干净的快车开始;通常通过以下终端命令完成的任务:

user$ express
user$ npm install

然后继续安装socket.io,方法如下:

user$ npm install socket.io --save

在我的main.js文件中有以下内容:

//app.js
var express  = require('express'),
  http     = require('http'),
  path     = require('path'),
  io       = require('socket.io'),
  routes   = require('./routes');

var app = express();

我通过将Socket.io服务器连接到express服务器来启动它:

//app.js
var server = http.createServer(app).listen(app.get('port'), function(){
  console.log('express server started!');
});

var sIo = io.listen(server);

我现在所做的是为Express设定通常的工作路线:

//app.js
app.get('/', routes.index);
app.get('/send/:recipient/:text', routes.sendMessage);

现在,既然我喜欢保持事情有条理,我想把我的socket.io代码放在另一个文件中,所以不使用通常的代码:

//app.js
sIo.sockets.on('connection', function(socket){
  console.log('got a connection');
});

我使用以下方法来访问套接字和sIo对象(因为该对象包含所有连接信息(重要)):

//app.js
sIo.sockets.on('connection', function(socket){
  routes.connection(sIo, socket);
});

// index.js (./routes)
exports.connection = function(sIo, socket){
  console.log('got a connection.');
};

这样我就可以在这里做我所有的socket.io工作了。我知道我现在可以从sIo对象访问我的所有客户端信息,但当然,它们不包含关于其会话数据的任何信息。

我现在的问题是:

>

  • 假设用户发出HTTP请求以发送消息,而我的路由中的处理程序如下所示:

    exports.sendmessage=function(req,res){//在这里做事情};

    我怎样才能让它在我的socket.io中“激发”一些东西来发送消息呢?我不想知道所有需要做的底层工作,比如跟踪消息、用户等,我只想了解如何“激发”socket.io来做一些事情。

    1. 如何确保socket.io只将消息发送给特定的人,并100%确保没有其他人收到消息?据我所知,没有办法从sIo对象获取会话信息。

    提前道谢。

  • 共有1个答案

    岳华灿
    2023-03-14

    问题一:将两者分开的最干净的方法可能是使用EventEmitter。您可以创建一个EventEmitter,当http消息传入时发出该EventEmitter。您可以将会话信息与事件一起传递,以便在必要时将其绑定回发送消息的用户。

    // index.js (./routes)
    var EventEmitter = require('events').EventEmitter;
    
    module.exports.messageEmitter = messageEmitter = new EventEmitter();
    
    module.exports.sendMessage = function(req, res) {
      messageEmitter.emit('private_message', req.params.recipient, req.params.text);
    };
    

    问题2:您可以在进行初始连接时访问套接字。一个主要借用这个答案的例子:

    var connect = require('connect'),
        userMap = {};
    
    routes.messageEmitter.on('private_message', function(recipient, text) {
        userMap[recipient].emit('private_message', text);  
    });
    
    io.on('connection', function(socket_client) {
      var cookie_string = socket_client.request.headers.cookie;
      var parsed_cookies = connect.utils.parseCookie(cookie_string);
      var connect_sid = parsed_cookies['connect.sid'];
      if (connect_sid) {
        session_store.get(connect_sid, function (error, session) {
          userMap[session.username] = socket_client;
        });
      }
    
      socket_client.on('private_message', function(username, message) {
          userMap[username].emit(private_message, message)
      });
    });
    

    所以我们只是在会话的用户名和套接字连接之间创建一个映射。现在,无论何时需要发送消息,您都可以轻松地查找与该用户关联的套接字,并使用他们的套接字向他们发送消息。只需确保处理断开,并在多个选项卡中重新连接和连接,等等。

     类似资料:
    • 问题内容: 我一直在寻找运气不佳的网络。我试图弄清楚如何从一个用户向另一个用户发送私人消息。有很多片段,但是我不确定客户端/服务器之间的交互。如果我有要发送到的套接字的ID,该如何将其发送到服务器,以及如何确保服务器仅将消息发送到该接收者的套接字? 有没有人知道的教程或演练? 问题答案: 无需教程。关于Socket.IO的常见问题很简单: 编辑: 人们在询问以后如何获取该对象时会链接到此问题。没有

    • 在SpringBoot中有一个“rest-server” 服务在某个地方安装了许多Java中的“rest-clients”。我不控制它。 “rest-server”为每个(!)生成公钥/私钥对客户端并与客户端共享pub密钥 每个“Rest-Client”生成自己的公钥/私钥对,并与“Rest-Server”共享公钥。客户端共享其公钥和唯一ID。 “Rest-Clients”不时轮询“”Rest-S

    • 比如获取电话等功能,信息是加密的,需要解密。 API: $decryptedData = $app->encryptor->decryptData($session, $iv, $encryptedData);

    • 问题内容: 因此,我一直在尝试使用带有node-rsa的node和带有jsencrypt的 javascript 创建一个网站(用于分配),其中javascript客户端获取服务器生成的公共密钥(node- rsa),对消息进行加密(jsencrypt)用户输入的密码,将其发送到服务器,并让服务器对其进行解密(node- rsa)。密钥的生成有效,而加密有效,但是解密无效。启动节点脚本时,请执行以