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