没有node.js服务器的客户端socket.io

为了在客户端使用socket.io,我们通常会启动一个node.js服务器,如下所示:

<script src="/socket.io/socket.io.js"></script> 

或与特定的端口:

 <script src="http://localhost:3700/socket.io/socket.io.js"></script> 

问题是:

是否有必要使用node.js服务器来为socket.io.js服务?

…或者有可能

做一个socket.io.js的本地副本,而不是去服务器每一次我们需要socket.io?


就像我们去查看源代码并复制从脚本标记源获得的所有东西,

粘贴并保存为socket.io-local.js,以便下次使用时:

 <script src="socket.io-local.js"></script> 

那会工作吗?


更新

感谢大家的好评,

我这样问是因为在涉及的情况下,我实际上没有访问服务器的权限:

我正在编写客户端来连接到用Java编写的其他开发人员的Socket Sever。

因此,我不得不想办法解决这个事实,即我没有服务器。

从我一直在testing的方式来看,这种方式似乎有效,但我真的不知道幕后发生了什么。

您显然可以将socket.io客户端库托pipe在任何地方并将其拉入一个页面。 但是,它几乎肯定不适用于基于Java的服务器。

为了理解为什么,你需要了解socket.io究竟在幕后做了些什么, 客户端库只是其中的一小部分。

Socket.io实际上定义并实现了自己的浏览器和服务器之间的实时通信协议 。 它支持多种传输方式 :例如,如果用户的浏览器或代理不支持WebSocket ,则可以回退到长轮询 。

socket.io客户端实际上做的是:

  1. /socket.io/1一个XHR GET请求。 服务器响应会话ID,configuration的超时和支持的传输。
  2. 客户端select用户浏览器支持的最佳传输。 在现代浏览器中,它将使用WebSockets。
  3. 如果支持WebSocket,它将创build一个新的WebSocket来启动一个WebSocket连接(HTTP GET with Upgrade: websocket header)到一个特殊的URL – /socket.io/1/websocket/<session id>
  4. 如果浏览器不支持WebSocket或者无法连接(像代理,filter,networking安全设备等不支持WebSocket请求的大量中介),则该库将回退到XHR long轮询,并将XHR请求发送到/socket.io/1/xhr-polling/<sesion id> 。 服务器不响应请求,直到有新消息可用或超时,客户端重复XHR请求。

Socket.io的服务器组件处理混乱的另一端。 它处理/socket.io/下的所有URL,build立会话,parsingWebSocket升级,实际发送消息,以及其他一些簿记。

如果没有socket.io服务器提供的所有服务,客户端库就没用了。 它只会向您的服务器上不存在的URL发出XHR请求。

我的猜测是你的基于Java的服务器只是实现了WebSockets协议。 您可以使用浏览器提供的WebSocket API直接连接到它。

你的服务器有可能实现了socket.io协议 – 有一些被遗弃的Java项目可以这样做 – 但这不太可能。 与服务器的开发人员交谈,以确定他是如何实现“套接字服务器”的。

socket.io-client的独立版本由socket.io服务器自动公开为/socket.io/socket.io.js 。 或者,您可以提供在此存储库根目录下find的文件socket.io-client.js

https://github.com/LearnBoost/socket.io-client

我有一个叫做shotgun-client的模块,实际上是封装了socket.io。 我需要提供自定义客户端脚本以及socket.io客户端脚本,但是我不希望我的模块的每个用户都必须在其页面上包含多个脚本引用。

我发现,安装时,您可以通过读取文件/node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js从socket.io生成客户端脚本。 所以我的模块为它自己的URL添加一个监听器,并且当它服务于我的自定义客户端脚本时,它也会为它提供socket.io客户端脚本。 中提琴! 只有我的模块的用户单个脚本引用:)

虽然这在技术上是可行的,但我不明白为什么你需要这样做。 如果您担心减less通过线路传输的数据,则此更改实际上不会超过较短的src标记中保存的less数字符。 简单地改变服务器上的JS文件的位置并不会真正提高性能 – JS必须被发送。

适当的caching(Socket.IO具有)将返回一个304 Not Modified(并且不会在每次加载页面时重新发送JS文件)。