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:/// 页面上执行时有效的主要内容,如果未能解决你的问题,请参考以下文章