WebSocket 仅在本地 file:/// 页面上执行时有效

Posted

技术标签:

【中文标题】WebSocket 仅在本地 file:/// 页面上执行时有效【英文标题】:WebSocket only works when executing on local file:/// page 【发布时间】:2011-02-06 00:34:39 【问题描述】:

我正在试验 html5 WebSockets,我的基本客户端/服务器场景使用 Nugget 工作。但是,它仅在我执行本地 HTML 文件 (file:///) 时有效;只要我通过http://localhost/ 执行它就会失败。

因此,从 file:/// HTML 文件连接到 localhost 是可行的,但通过 http://localhost/ 连接到 localhost 会失败。这很奇怪也很烦人,因为我希望能够在我的家庭网络中使用它。

我认为这可能是因为来源不同(不同的端口),但这不是原因,因为端口必须不同,以免Apache响应WebSocket请求。

客户端代码本身是最基本的形式:

var ws;

function wsi() 
 ws = new WebSocket('ws://localhost:8887/consoleappsample');

 ws.onmessage = function (evt) 
  alert(evt.data);
 


window.onload = wsi;

有人看到我做错了什么吗?

【问题讨论】:

你试过检查document.domain吗? 对于 file:/// 文件,它返回一个空字符串(并且套接字有效),对于 localhost 它返回“localhost”(并且套接字无效) 你用哪个浏览器来测试这个? 忘了说;这是 Chrome 9。 你在使用 web-socket.js 吗?或者只是浏览器中的 websocket 【参考方案1】:

我终于解决了。

在服务器中,必须添加以下内容(* 而不是null),当然要替换 x:

var nugget = new WebSocketServer(8887, "*", "ws://192.168.x.x:8887");

然后,在 HandshakeHandler.cs 中,添加以下内容(当前不存在最后一个条件):

if (hasRequiredFields && "ws://"+ClientHandshake.Host == Location && (ClientHandshake.Origin == Origin || Origin=="*"))

感谢所有回复。

【讨论】:

以上是关于WebSocket 仅在本地 file:/// 页面上执行时有效的主要内容,如果未能解决你的问题,请参考以下文章

Websocket 握手仅在 IE 10 中立即关闭

HTML5 Websocket HTTP身份验证失败;没有有效的凭据可用

mPDF - 仅在奇数页上显示背景

帖子页脚仅在悬停后可见?

UWP 打印预览仅在第一页显示空白页

如何在 Chrome 中加载下一页之前断开 websocket