我在play 2.1中有一个websockets程序,它运行得很好,模板看起来像这样:
// Contents of the view.scala.html file
@(userName: String)(implicit request: RequestHeader)
@main("text") {
<script type="text/javascript" charset="utf-8">
$(function() {
var WS = window['MozWebSocket'] ? MozWebSocket : WebSocket;
alert("before")
var socket = new WS("@routes.Application.view(userName).webSocketURL()");
alert("after")
socket.onmessage = function(event) {
alert(event.data);
};
});
</script>
}
问题在于,只要我将javascript移动到assets.javascripts
文件夹并将view.scala.html
文件更改为以下内容,它就会停止工作。
// Contents of the view.scala.html file
@(userName: String)(implicit request: RequestHeader)
@main("text") {
<script type="text/javascript" charset="utf-8"
src="@routes.Assets.at("javascripts/viewer.min.js")"></script>
}
播放找到文件,执行javascript,我可以看到由alert("before")
代码行触发的弹出窗口,但之后......没有。
这是我在控制台中收到的Google Chrome错误:
Wrong url scheme for WebSocket
http://localhost:9000/@routes.Application.view(userName).webSocketURL()
我错过了什么?
答案 0 :(得分:8)
WebSocket需要ws://
或wss://
(对于SSL)而不是http://
。
但是,代码中的问题是语句@routes.Application.view(userName).webSocketURL()
显然没有被一些有用的值替换,而是保持原样。这是因为你的框架似乎认为资产是完全静态的,因此忽略了那些在普通模板中是占位符/变量的东西。
您的问题的一个可能解决方案是在您的模板中保留网址,例如将data-ws="@....."
添加到<body>
标记,然后使用JavaScript提取该属性:
var socket = new WebSocket(document.body.getAttribute('data-ws'))
答案 1 :(得分:1)
我使用了以下内容:
ws=new WebSocket("ws://localhost:8080/websocket/wsserver");
感谢。