我试图了解 socket.io 的 Javascript 客户端代码是如何工作的。具体来说,我的目标是了解,它如何知道服务器的位置?
我在程序中使用的客户端代码非常简单——我只是链接到 socket.io.js:
<script src="./socket.io/socket.io.js"></script>
进而:
var socket = io.connect()
就是这样 - 套接字自动连接到服务器。但它怎么知道?
我查看了 socket.io.js,这就是我发现的(已删除评论):
var io = ('undefined' === typeof module ? {} : module.exports);
(function() {
/** Copyright(c) 2011 LearnBoost <dev@learnboost.com> * MIT Licensed */
(function (exports, global) {
var io = exports;
io.version = '0.9.11';
io.protocol = 1;
io.transports = [];
io.j = [];
io.sockets = {};
/**
* Manages connections to hosts.
* @param {String} uri
* @Param {Boolean} force creation of new socket (defaults to false)
* @api public
*/
io.connect = function (host, details) {
var uri = io.util.parseUri(host)
, uuri
, socket;
if (global && global.location) {
uri.protocol = uri.protocol || global.location.protocol.slice(0, -1);
uri.host = uri.host || (global.document
? global.document.domain : global.location.hostname);
uri.port = uri.port || global.location.port;
}
uuri = io.util.uniqueUri(uri);
...
})('object' === typeof module ? module.exports : (this.io = {}), this);
...
})();
似乎秘密就在“全局”参数中,但是,究竟是谁将“全局”发送给这个函数呢?(很难理解所有括号中的函数......)