繁体   English   中英

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

[英]Client-side socket.io without a node.js server

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

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

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

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

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

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

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

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

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

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

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

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

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客户端脚本。 中提琴! 我模块的用户只有一个脚本引用:)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM