【问题标题】:Socket IO | How to get the client transport type on the serverside?套接字IO |如何在服务器端获取客户端传输类型?
【发布时间】:2011-09-10 23:16:20
【问题描述】:

我需要知道客户端对 nodeJS 服务器端的某些条件语句使用什么传输方法。

有谁知道我如何获得这些信息?它是否保存在客户端对象中?

【问题讨论】:

  • 没有简单的方法来获取这些信息。来源并不容易访问。

标签: javascript node.js socket.io


【解决方案1】:

从 Socket.IO 1.0 开始:

客户

socket.on('connect', function() {
    console.log(socket.io.engine.transport.name);
}

服务器

io.sockets.on('connection', function(socket) {
    console.log(socket.conn.transport.name);
}

【讨论】:

    【解决方案2】:

    在 socket.io 0.7.6 中

    io.sockets.on('connection', function(client) {
        console.log(io.transports[client.id].name);
    });
    

    【讨论】:

      【解决方案3】:

      2012 年 4 月,这有效:socket.transport

      【讨论】:

        【解决方案4】:

        如果您深入研究客户端对象的内部结构,我相信您可以找到它,尽管在不知道您为什么需要它的情况下,我不得不建议不要进行这种检查,原因有两个:

        首先,由于它不在 API 中,因此开发人员完全没有责任保持向后兼容,因此任何给定版本都可能以不同的方式实现/存储该信息,这只会影响您自己的开发并导致问题。

        其次,更重要的是,我建议您重新考虑您的设计,通过 socket.io 与服务器的通信被构建为对所使用的方法透明。两边应该没有区别。这就是这个库的目的,设计一个表现不同的应用程序与这个想法完全正交。

        【讨论】:

        • 这个问题是我想知道传输类型的原因stackoverflow.com/questions/6280569/…
        • @davin 在深入挖掘内部结构之后,它实际上是不可能的。
        • @Raynos,我想我记得曾经在客户端对象(或子对象)中的某处看到过 url 属性,你不能使用与库相同的约定将它从那里正则表达式自己使用?
        • 也许,我觉得是的,但我不知道url 住在哪里,也不知道它的标准格式是什么。如前所述,这是一个 HACK
        • @Raynos,是的,我已经提到过依赖这样的非公开内容是危险的;不用喊:)
        【解决方案5】:

        为了参考和谷歌绊倒:- 如果有人仍在使用 v0.9(或更早版本) 您可以像这样从客户端访问此信息:

        var socket = io.connect();
        console.log(socket.socket.transport.name); //log the name of the transport being used.
        

        在谷歌群组https://groups.google.com/forum/#!topic/socket_io/yx_9wJiiAg0找到答案

        【讨论】:

          【解决方案6】:

          我相信这会解决您的问题。我的技巧是在客户端连接后将传输类型保存在 HTTP 请求对象上。然后,您可以稍后在您的回调中获取它。首先我们调整 Listener 类:

          var io = require('socket.io'),
          io.Listener.prototype._onConnectionOld = io.Listener.prototype._onConnection;
          io.Listener.prototype._onConnection = function(transport, req, res, up, head){
            req.socketIOTransport = transport;  // Take note of the transport type
            this._onConnectionOld.call(this, transport, req, res, up, head);
          };
          

          然后在您的应用正文中:

          var socket = io.listen(app),
          socket.on('connection', function(client){
              console.log(client.request.socketIOTransport);  // Lets check that transport
              // ...
          });
          

          希望这会有所帮助!

          【讨论】:

            【解决方案7】:
            io.connect.managers['connect url/port'].engine.transport
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-09-28
              • 2012-07-13
              • 1970-01-01
              • 1970-01-01
              • 2011-11-15
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多