1

注意:我已经在 grails-user 邮件列表中交叉发布了这个问题

这个周末,使用这篇精彩的博客文章作为指南和 cometd grails 插件,我能够使用我现有的 grails 应用程序安装 cometd。一切都在 FireFox 和 IE 中完美运行(信不信由你),但我在使用 Google Chrome 时遇到了问题。据我所知,它发生在我的 javascript 中的 comet.init() 行上。

使用 Chrome 的开发人员工具,我看到了这个错误:WebSocket http://localhost:8080/myapp/cometd/handshake的 URL 方案错误

我做了很多搜索,发现一篇文章说 Chrome 在 WebSocket 和 localhost 上有问题。有了这些知识,我编辑了我的主机文件,看起来像:
127.0.0.1 local.mydomain.com

comet.init() 的 url 然后变为http://local.mydomain.com:8080/myapp/cometd/handshake。但是,这并没有解决问题,Chrome 也遇到了同样的问题,但这次它看起来不喜欢指定的端口。我将本地应用程序更改为在端口 80 上运行,然后 url 变为http://local.mydomain.com/myapp/cometd/handshake,但仍然没有骰子。

据我所知,cometd 2.0 通过在本身不支持 WebSocket 的浏览器(Firefox、IE 等)中使用长轮询来模拟 WebSocket,并在支持它的浏览器(Chrome)中使用 WebSocket,所以我猜测这就是我的问题的来源。

搜索也让我相信 WebSocket url 应该以 ws:// 而不是 http:// 开头,所以也许这是我的问题,但我不知道如何使用 tomcat/grails 配置它。

有谁知道我可以如何纠正我的问题?

4

2 回答 2

3

我想我在我的javascript中找到了使用这行代码的临时工作:cometd.unregisterTransport('websocket'); 但我仍然很想知道将来如何在我的 grails 项目中使用 Websocket 协议

于 2011-02-24T07:29:25.853 回答
1

如果您使用 Grails 和 Cometd 插件,请确保您只从 Javascript 启用 websockets。您还应该将 Tomcat 插件替换为 Jetty 7 插件。请记住,如果您使用长轮询,您的配置 url 将以 http:// 或 https:// 开头,如果您使用 websockets,则它必须以 wss:// 开头。

尝试这个

var url = "";
if (Websocket === undefined) {
   url = "http://mydomain/myconext/cometd";
} else {
  url = "ws://mydomain/myconext/cometd";
} 

cometd.configure({
    url: url
});

我建议使用闪存桥。这将比使用长轮询快得多。请参阅下面的链接。 https://github.com/gimite/web-socket-js

于 2011-07-18T06:35:12.267 回答