现在在 php 的帮助下,我通过 ip:port(使用 fsockopen 函数)从不同的套接字接收数据。这样做是为了获取当前在不同电台播放的歌曲:
$open = fsockopen($radioip,$radioport,$errno,$errstr,'.5');
if ($open) {
fputs($open,"GET /7.html HTTP/1.1\nUser-Agent:Mozilla\n\n");
stream_set_timeout($open,'1');
$read = fread($open,255); }
结果,主页上的主要 javascript 定期访问服务器上的这个 php。我希望所有这些都可以在没有对服务器不必要的请求的情况下工作,而是通过浏览器本身。是否可以在 javascript 中实现类似的功能 - 将 ip 和端口传递给它并获得必要的数据?
不幸的是,只有当响应者在响应标头中具有 Access-Control-Allow-Origin 和您的来源时,您的“来源”之外的任何浏览器请求才有可能。出于安全原因,此案例已全部关闭。如果可以从任何站点使用 AJAX 调用另一个站点 - 很多不好的事情都可以通过这种方式完成。
有关跨域 AJAX 的更多信息,例如此处
在这种情况下,Websockets 根本帮不了你,因为。它是服务器和客户端之间的独立通信协议。而且最近浏览器越来越强制wss(encrypted web sockets),为此,除了支持Websockets之外,还需要在这个支持服务器上使用SSL。所以你尤其不能没有中间 php 脚本。
如果你问这个问题是因为你的服务器负载很重,你应该考虑用类似 websockets 的东西来促进这整个事情。不是通过第三方服务器,而是通过您自己的服务器。例如,它将以一定的频率更新其在远程服务器上的缓存,并以一定的频率(或在发生变化时)向客户端发送信息。在 websockets 中,连接保持不变,客户端和服务器之间可以进行双向对话。因此,客户端不需要经常访问任何页面,但他们只会在发送消息时收到一条 websocket 消息。例如,这可以在 Node.js 或 ASP.net 中实现。在 PHP 中,我个人没有见过这样的东西。
尝试 HTML5 Web 套接字。
1006 CLOSE_ABNORMAL 保留。当需要状态代码时,用于指示连接异常关闭(即没有发送关闭帧)。
https://developer.mozilla.org/en/docs/Web/API/CloseEvent
来自关于 CloseEvent 的 Mozil 参考书 但我假设另一侧根本没有 websocket 服务器,如果是这样,那么从页面(从浏览器读取)您将不会以任何方式从该套接字接收数据流。
为了让您通过 WebSocket 连接到该服务器,该服务器必须支持WebSocket 协议,它与 HTTP 略有不同。
所有流行的服务器都有支持此协议的模块。
如果您不控制远程服务器,那么仍然建议您缓存数据:例如,如果您知道现在正在播放
t具有持续时间的组合的某某秒s,那么下次您需要联系该服务器时仅在s-t几秒钟后。除了 WebSocket 技术和浏览器中明显的漏洞之外,您无法仅使用 JS 连接到任意 IP 上的任意端口来接收数据。想象一下,如果那是可能的!