12

要在客户端使用 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时都制作socket.io.js的本地副本而不是去服务器?


就像,我们去查看源代码并复制我们从脚本标签的源代码中获得的所有内容,

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

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

那行得通吗?


更新

谢谢大家的热心回复,

我问这个是因为在我参与的情况下,我实际上无权访问服务器:

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

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

从我一直在测试的情况来看,这种方式似乎可行,但我真的不知道幕后发生了什么。

4

3 回答 3

30

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

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

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

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

  1. 发出 XHRGET请求/socket.io/1。服务器使用会话 ID、配置的超时和支持的传输进行响应。
  2. 客户端选择用户浏览器支持的最佳传输。在现代浏览器中,它将使用 WebSockets。
  3. 如果支持 WebSockets,它会创建一个新WebSocket的用于启动 WebSocket 连接(GET带有Upgrade: websocket标头的 HTTP)到一个特殊的 URL – /socket.io/1/websocket/<session id>.
  4. 如果浏览器不支持 WebSockets 或连接失败(有很多不支持 WebSocket 请求的代理、过滤器、网络安全设备等中介),库将回退到 XHR long轮询,并向/socket.io/1/xhr-polling/<sesion id>. 在有新消息可用或达到超时之前,服务器不会响应请求,此时客户端会重复 XHR 请求。

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

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

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

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

于 2013-10-22T15:57:02.327 回答
4

socket.io-client 的独立版本由 socket.io 服务器自动公开为/socket.io/socket.io.js. 或者,您可以提供在此存储库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 客户端脚本提供服务。中提琴!我的模块的用户只有一个脚本参考:)

于 2013-10-22T15:22:21.420 回答
1

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

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

于 2013-10-21T23:53:50.797 回答