Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Socket.io - Fatal编程技术网

Javascript 浏览器如何知道在哪里可以找到socket.io?

Javascript 浏览器如何知道在哪里可以找到socket.io?,javascript,socket.io,Javascript,Socket.io,浏览器如何知道如何从该引用中获取socket.io?上次检查时,我的公用文件夹中没有socket.io.js文件 更新:Socket.io工作正常,我只是好奇它是如何使用这个神秘的路径来获取客户端Socket.io代码的 谢谢你的详尽回答:)事实上,这里有一些小小的魔力。当您安装服务器端socket.io库并通过将其传递给web服务器对其进行初始化时,对于/socket.io/socket.io.js的任何请求,它会自动将路由处理程序安装到您的web服务器中,并且每当需要特定的/socket.i

浏览器如何知道如何从该引用中获取socket.io?上次检查时,我的公用文件夹中没有socket.io.js文件

更新:Socket.io工作正常,我只是好奇它是如何使用这个神秘的路径来获取客户端Socket.io代码的


谢谢你的详尽回答:)

事实上,这里有一些小小的魔力。当您安装服务器端
socket.io
库并通过将其传递给web服务器对其进行初始化时,对于
/socket.io/socket.io.js
的任何请求,它会自动将路由处理程序安装到您的web服务器中,并且每当需要特定的
/socket.io/socket.io.js
路由时,它将为客户端提供一个
socket.io.js
文件请求

因此,文件实际上并不来自请求的确切路径(这只是安装处理程序的路径)。该文件实际上来自服务器端安装目录(位于
node\u modules/socket.io
中)。这样做的好处是,由于socket.io的服务器端实现和客户端实现都来自完全相同的NPM安装,因此始终保证它们是相同的版本,这样就不会出现客户端和服务器版本不同步的问题

以下是服务于
/socket.io/socket.io.js
的相关部分供参考:

<script src="/socket.io/socket.io.js"></script>
var clientSource=read(require.resolve('socket.io client/socket.io.js'),'utf-8');
Server.prototype.serve=功能(请求、恢复){
var etag=req.headers['if-none-match'];
如果(etag){
if(clientVersion==etag){
调试('SERVICE client 304');
书面记录(304);
res.end();
返回;
}
}
调试(“服务客户端源”);
res.setHeader('Content-Type','application/javascript');
res.setHeader('ETag',clientVersion);
书面记录(200);
res.end(clientSource);
};
/**
*附加静态文件服务。
*
*@param{Function | http.Server}http服务器
*@api private
*/
Server.prototype.attachServe=函数(srv){
调试(“附加客户端服务请求处理程序”);
var url=this._path+'/socket.io.js';
var evs=srv.listeners('request').slice(0);
var self=这个;
srv.removeAllListeners('request');
srv.on('请求',功能(请求,恢复){
if(0==req.url.indexOf(url)){
自助服务(请求、回复);
}否则{
对于(变量i=0;i
您确定它不是
//socket.io/…
是的。我有一个前导斜杠,它是有效的。我一辈子都搞不清楚浏览器是如何获取该文件的。我认为它是由socket.io本身通过WebSocket提供的。@像这样的Costa资源是HTTP,与WebSocket没有任何关系。只有当您将socket.io服务器托管在与web应用程序相同的位置时,在这个问题上绝对没有迹象表明这正在发生。。。事实上,根据我的经验,这是一种罕见且糟糕的做法。没有理由用静态文件加载Socket.IO服务器。在别处托管这些,然后用完整的URL引用客户端到Socket.IO服务器。@Brad-我不同意。First-off socket.io是一个web应用程序。每个socket.io连接都以HTTP请求开始,因此每个socket.io服务器都使用一个web服务器,在node.js世界中,其他所有服务通常都来自同一个HTTP服务器。而且,
“/socket.io/socket.io.js”
是默认路径,socket.io在该路径上承载其自己的基于客户端的socket.io.js副本。而且,OP声明它似乎在工作,但他们没有做任何事情让它工作。因此,他们想知道它是如何工作的。socket.io服务器正在使其正常工作。还可能是什么?是的,我很清楚Socket.IO的工作原理。他的问题中没有任何东西表明它确实在工作,所以我假设它不工作,因为他忽略了在Socket.IO服务器上为客户机输入完整的URL。我还假设他没有在Socket.IO服务器上托管他的HTML,因为他在问题中没有指出这一点,这不是一件常见的事情(也不应该是……这是一种不好的做法)。无论如何,我认为你对问题所在的看法是正确的,所以在解决一个模糊问题的细节方面做得很好。:-)@Brad-不知道你是从哪里想到的,在应用程序中使用与socket.io相同的web服务器是一种“坏习惯”。如果您从node.js开始作为您的核心后端开发环境,并且具有各种各样的优势,那么这是一个非常非常常见的实现。而且,如果你几乎没有负载,那也没关系。但是,如果您有大量的流量,就让像Nginx这样的真正web服务器或像CDN这样的分布式服务器的本机性能来处理所有静态HTML。没有理由让Socket.IO服务器只执行静态服务,而在其他地方可以更有效地处理静态服务。
var clientSource = read(require.resolve('socket.io-client/socket.io.js'), 'utf-8');

Server.prototype.serve = function(req, res){
  var etag = req.headers['if-none-match'];
  if (etag) {
    if (clientVersion == etag) {
      debug('serve client 304');
      res.writeHead(304);
      res.end();
      return;
    }
  }

  debug('serve client source');
  res.setHeader('Content-Type', 'application/javascript');
  res.setHeader('ETag', clientVersion);
  res.writeHead(200);
  res.end(clientSource);
};

/**
 * Attaches the static file serving.
 *
 * @param {Function|http.Server} http server
 * @api private
 */

Server.prototype.attachServe = function(srv){
  debug('attaching client serving req handler');
  var url = this._path + '/socket.io.js';
  var evs = srv.listeners('request').slice(0);
  var self = this;
  srv.removeAllListeners('request');
  srv.on('request', function(req, res) {
    if (0 === req.url.indexOf(url)) {
      self.serve(req, res);
    } else {
      for (var i = 0; i < evs.length; i++) {
        evs[i].call(srv, req, res);
      }
    }
  });
};