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

时间:2013-10-21 23:49:49

标签: javascript 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。

因此,我必须想办法解决一下我没有服务器的事实。

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

3 个答案:

答案 0 :(得分:26)

你显然可以在任何地方托管 socket.io客户端库并将其拉入页面。但是,基于Java的服务器几乎肯定会无法正常工作

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

Socket.io实际上定义并实现了its own protocol,用于浏览器和服务器之间的实时通信。它以支持多个传输的方式执行此操作:例如,如果用户的浏览器或代理不支持WebSockets,则可以回退到long polling。< / p>

socket.io客户端实际执行的操作是:

  1. GET发出XHR /socket.io/1请求。服务器使用会话ID,配置的超时和支持的传输进行响应。
  2. 客户端选择用户浏览器支持的最佳传输。在现代浏览器中,它将使用WebSockets。
  3. 如果支持WebSockets,它会创建一个新的WebSocket以启动WebSocket连接(带有GET标头的HTTP Upgrade: websocket)到特殊URL - /socket.io/1/websocket/<session id>
  4. 如果浏览器不支持WebSockets或无法连接(有许多中间人,如代理,过滤器,网络安全设备等,不支持WebSocket请求),库将退回到XHR长轮询,并向/socket.io/1/xhr-polling/<sesion id>发出XHR请求。在新消息可用或达到超时之前,服务器不会响应请求,此时客户端会重复XHR请求。
  5. Socket.io的服务器组件处理该混乱的另一端。它处理/socket.io/下的所有URL,设置会话,解析WebSocket升级,实际发送消息以及一堆其他簿记。

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

    我的猜测是你的基于Java的服务器只是实现了WebSockets协议。您可以使用the browser-provided WebSocket APIs直接与其建立连接。

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

答案 1 :(得分:4)

  

socket.io-client的独立版本由socket.io服务器自动公开为/socket.io/socket.io.js。或者,您也可以提供this repository根目录中的socket.io-client.js文件。

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

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

我发现,安装后,您可以通过reading the file /node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js从socket.io提供生成的客户端脚本。所以我的模块为自己的URL添加了一个监听器,当它为我的自定义客户端脚本提供服务时,它还为它提供了socket.io客户端脚本。中提琴!我的模块用户只有一个脚本引用:)

答案 2 :(得分:1)

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

正确的缓存(Socket.IO有)将返回304 Not Modified(并且不会在每次加载页面时重新发送JS文件)。