注意:我已经在grails-user邮件列表中交叉发布了这个问题
本周末使用this fantastic blog帖子作为指南和cometd grails插件,我能够使用现有的grails应用程序安装cometd。一切都在FireFox和IE中完美运行(信不信由你),但我遇到谷歌Chrome问题。从我可以告诉它发生在我的javascript中的comet.init()行。
使用Chrome的开发者工具,我看到了这个错误: WebSocket http://localhost:8080/myapp/cometd/handshake
的错误网址方案我已经做了很多搜索,发现一条帖子说Chrome有WebSocket和localhost的问题。有了这些知识,我编辑了我的主机文件,看起来像: 127.0.0.1 local.mydomain.com
comet.init()的网址随后变为http://local.mydomain.com:8080/myapp/cometd/handshake。但是,这并没有解决问题,Chrome也遇到了同样的问题,但这次看起来好像不喜欢指定的端口。我将本地应用程序更改为在端口80上运行,然后网址变为http://local.mydomain.com/myapp/cometd/handshake,但仍然没有骰子。
据我所知,cometd 2.0通过在不支持WebSocket(Firefox,IE等)的浏览器中使用长轮询来模拟WebSocket,并在支持它的浏览器中使用WebSocket(Chrome),所以我猜这就是我的问题所在。
搜索也让我相信WebSocket网址应该以ws://而不是http://开头,所以也许这是我的问题,但我不知道如何用tomcat / grails配置它。
有谁知道我如何纠正我的问题?
答案 0 :(得分:3)
我想我在javascript中找到了一段临时的工作:cometd.unregisterTransport('websocket');但是我仍然想知道将来如何在我的grails项目中使用Websocket协议
答案 1 :(得分:1)
如果你使用Grails和Cometd插件,请确保你只是从Javascript启用websockets。你还要用Jetty 7插件替换Tomcat插件。请记住,如果您使用长轮询,您的配置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