4

Play 2.1にWebSocketプログラムがあります。これは問題なく動作し、テンプレートは次のようになります。

// 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")が、その後は...何もありません。

これは私がコンソールで得るグーグルクロームエラーです:

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()が明らかにいくつかの有用な値に置き換えられず、そのまま維持されることです。これは、フレームワークがアセットを完全に静的であると見なしているように見えるため、通常のテンプレートのプレースホルダー/変数となるアセットを無視するためです。

問題の1つの可能な解決策は、たとえばタグに追加data-ws="@....."し、<body>JavaScriptを使用してその属性を抽出することにより、テンプレートにURLを保持することです。

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 に答える