Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Socket IO |如何在服务器端获取客户端传输类型?_Javascript_Node.js_Socket.io - Fatal编程技术网

Javascript Socket IO |如何在服务器端获取客户端传输类型?

Javascript Socket IO |如何在服务器端获取客户端传输类型?,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我需要知道客户端在nodeJS服务器端对某些条件语句使用的传输方法。 有人知道我怎样才能得到这些信息吗?它是否保存在客户端对象中?我确信,如果您深入挖掘客户端对象的内部,您可以找到它,尽管不知道您为什么需要它,我建议您不要进行此类检查,原因有二: 首先,由于它不在API中,开发人员完全没有责任保持向后兼容,因此任何给定的版本都可能以不同的方式实现/存储该信息,这只会影响到您自己的开发并导致问题 其次,也是更重要的一点,我建议您重新考虑您的设计,通过socket.io与服务器的通信对于所使用的方法

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


有人知道我怎样才能得到这些信息吗?它是否保存在客户端对象中?

我确信,如果您深入挖掘客户端对象的内部,您可以找到它,尽管不知道您为什么需要它,我建议您不要进行此类检查,原因有二:

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


其次,也是更重要的一点,我建议您重新考虑您的设计,通过socket.io与服务器的通信对于所使用的方法是透明的。双方应该没有区别。这就是库的目的,设计一个行为与此完全正交的应用程序。

我相信这会解决你的问题。这里我的技巧是在客户端连接后保存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
    // ...
});
希望这有帮助

在socket.io 0.7.6中

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

2012年4月,这项工作:socket.transport

自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);
}
服务器

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

为了便于参考,谷歌遇到了一些问题:- 如果任何人仍在使用v0.9(或可能更早) 您可以通过以下方式从客户端访问此信息:

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

在谷歌群组上找到答案

获取这些信息没有简单的方法。源代码不便于访问。这个问题就是我想在挖掘内部后知道传输类型@davin的原因。这实际上是不可能的。@Raynos,我记得曾经在客户端对象(或子对象)的某个地方看到过
url
属性,你不能用库本身使用的相同约定将其正则化吗?也许,我感觉是的,但我不知道
url
在哪里,也不知道它的标准格式是什么。这是一个黑客行为。@Raynos,是的,我已经提到过依赖非公开的东西是危险的;不用喊:)