【发布时间】:2011-09-10 23:16:20
【问题描述】:
我需要知道客户端对 nodeJS 服务器端的某些条件语句使用什么传输方法。
有谁知道我如何获得这些信息?它是否保存在客户端对象中?
【问题讨论】:
-
没有简单的方法来获取这些信息。来源并不容易访问。
标签: javascript node.js socket.io
我需要知道客户端对 nodeJS 服务器端的某些条件语句使用什么传输方法。
有谁知道我如何获得这些信息?它是否保存在客户端对象中?
【问题讨论】:
标签: javascript node.js socket.io
从 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.io 0.7.6 中
io.sockets.on('connection', function(client) {
console.log(io.transports[client.id].name);
});
【讨论】:
2012 年 4 月,这有效:socket.transport
【讨论】:
如果您深入研究客户端对象的内部结构,我相信您可以找到它,尽管在不知道您为什么需要它的情况下,我不得不建议不要进行这种检查,原因有两个:
首先,由于它不在 API 中,因此开发人员完全没有责任保持向后兼容,因此任何给定版本都可能以不同的方式实现/存储该信息,这只会影响您自己的开发并导致问题。
其次,更重要的是,我建议您重新考虑您的设计,通过 socket.io 与服务器的通信被构建为对所使用的方法透明。两边应该没有区别。这就是这个库的目的,设计一个表现不同的应用程序与这个想法完全正交。
【讨论】:
url 属性,你不能使用与库相同的约定将它从那里正则表达式自己使用?
url 住在哪里,也不知道它的标准格式是什么。如前所述,这是一个 HACK。
为了参考和谷歌绊倒:- 如果有人仍在使用 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找到答案
【讨论】:
我相信这会解决您的问题。我的技巧是在客户端连接后将传输类型保存在 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
// ...
});
希望这会有所帮助!
【讨论】:
io.connect.managers['connect url/port'].engine.transport
【讨论】: