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

Client-side socket.io without a node.js server

本文关键字:客户端 socket io 服务器 node js 没有      更新时间:2023-09-26

要在客户端使用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>

这样行吗?


更新

感谢大家的积极响应,

我之所以这么问,是因为在我参与的情况下,我实际上无法访问服务器:

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

因此,我必须想一种方法来解决我没有服务器的问题

根据我的测试,这种方式似乎奏效了,但我真的不知道幕后发生了什么。

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

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

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

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

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

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

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

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

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

socket.io客户端的独立构建由socket.io服务器自动公开为/socket.io/socket.io.js。或者,您也可以提供位于该存储库根目录下的文件socket.io-client.js

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

我有一个名为霰弹枪客户端的模块,它实际上封装了socket.io。我需要提供自定义客户端脚本和socket.io客户端脚本,但我不希望我的模块的每个用户都必须在他们的页面上包含多个脚本引用。

我发现,安装后,您可以通过读取文件/node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js来提供socket.io生成的客户端脚本。因此,我的模块为自己的URL添加了一个监听器,当它为我的自定义客户端脚本提供服务时,它也为socket.io客户端脚本提供了服务。Viola!对于我的模块的用户,只有一个脚本参考:(

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

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