4

我在 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>
}

Play 找到文件,执行 javascript,我可以看到由alert("before")代码行触发的弹出窗口,但之后......什么都没有。

这是我在控制台中遇到的 google chrome 错误:

Wrong url scheme for WebSocket
http://localhost:9000/@routes.Application.view(userName).webSocketURL()

我错过了什么?

4

2 回答 2

10

WebSocket 需要ws://wss://(对于 SSL)而不是http://.

但是,您的代码中的问题是该语句@routes.Application.view(userName).webSocketURL()显然没有被一些有用的值替换,而是保持原样。这是因为您的框架似乎将资产视为完全静态的,因此忽略了其中任何可能是普通模板中的占位符/变量的内容。

解决您的问题的一种可能方法是将 URL 保留在您的模板中,例如通过添加data-ws="@....."到您的<body>标签,然后使用 JavaScript 来提取该属性:

var socket = new WebSocket(document.body.getAttribute('data-ws'))
于 2012-11-29T11:41:25.427 回答
1

我使用了以下内容:

  ws=new WebSocket("ws://localhost:8080/websocket/wsserver");

谢谢。

于 2014-02-11T10:06:38.093 回答