WebSocket的错误网址方案

时间:2012-11-29 11:38:24

标签: javascript playframework-2.0

我在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()

我错过了什么?

2 个答案:

答案 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");

感谢。