Socket IO | Как получить тип транспорта клиента на сервере?

Мне нужно знать, какой транспортный метод используется клиентом для некоторых условных операторов на сервере nodeJS.

Кто-нибудь знает, как я могу получить эту информацию? Поддерживается ли он внутри объекта клиента?

Ответ 1

В socket.io 0.7.6

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

Ответ 2

Как по Socket.IO 1.0:

Client

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

Сервер

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

Ответ 3

Апрель 2012, это работает: socket.transport

Ответ 4

Я уверен, что вы можете найти его, если вы копаете внутренности объекта клиента, хотя, не зная, зачем вам это нужно, я должен рекомендовать против такого рода проверки по двум причинам:

Во-первых, поскольку он не входит в API, разработчики не несут никакой ответственности за совместимость вещей, поэтому любая данная версия может реализовать/хранить эту информацию по-разному, что будет только пульсировать в вашей собственной разработке и вызывать проблемы.

Во-вторых, и что более важно, я предлагаю вам переосмыслить свой дизайн, связь с сервером через socket.io строится так, чтобы быть прозрачным для используемого метода. Не должно быть никакой разницы с обеих сторон. То, что цель библиотеки, создавая приложение, которое ведет себя иначе, полностью ортогонально этой идее.

Ответ 5

для справки, и google спотыкается: - в случае, если кто-то все еще использует v0.9 (или, возможно, раньше) вы можете получить доступ к этой информации с клиентской стороны следующим образом:

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

ответ найден в группах google 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