0

我似乎無法讓WebSocket通信在Play Framework 2.1版中工作。Chrome中的Play Framework 2.1 websockets

我創建了一個簡單的測試,只需按一下按鈕就可以發送消息。所有代碼都在下面。但除了按鈕,什麼也沒有顯示出來。

有沒有人看過這個問題,或者有人能告訴我在下面的代碼中我可能會做錯什麼?

我使用的是最新版本的Chrome。

這是我簡單的設置。

在Application.java

public static Result index() { 
    return ok(index.render()); 
} 

public static WebSocket<String> sockHandler() { 
    return new WebSocket<String>() { 
     // called when the websocket is established 
     public void onReady(WebSocket.In<String> in, 
       WebSocket.Out<String> out) { 
      // register a callback for processing instream events 
      in.onMessage(new Callback<String>() { 
       public void invoke(String event) { 
        System.out.println(event); 
       } 
      }); 

      // write out a greeting 
      out.write("I'm contacting you regarding your recent websocket."); 
     } 
    }; 
} 

在routes文件 GET/controllers.Application.index()

# Map static resources from the /public folder to the /assets URL path 
GET  /assets/*file    controllers.Assets.at(path="/public", file) 
GET  /greeter     controllers.Application.sockHandler() 

在Index.Scala.html

@main(null) { 

<div class="greeting"></div> 
<button class="send">Send</button> 

<script type="text/javascript" charset="utf-8"> 

    $(function() { 
     var WS = window['MozWebSocket'] ? MozWebSocket : WebSocket 
     var sock = new WS("@routes.Application.sockHandler()") 

     sock.onmessage = function(event) { 
      $('.greeting').append(event.data) 
     } 

     $('button.send').click(function() { 
      sock.send("I'm sending a message now.") 
     });    
    }) 

</script> 

}

在Main.scala.html

@(title: String)(content: Html) 
<!DOCTYPE html> 
<html> 
<head> 
    <title>@title</title> 
    <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")"> 
    <link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")"> 
    <script src="@routes.Assets.at("javascripts/jquery-1.7.1.min.js")" type="text/javascript"></script> 
</head> 
<body> 
    @content 
</body> 

回答

3

可以使用路由的webSocketURL()方法來檢索可傳遞到WebSocket的構造函數的URL。下面是遊戲的WebSocket的聊天樣本代碼的例子:

$(function() {    
    var WS = window['MozWebSocket'] ? MozWebSocket : WebSocket 
    var chatSocket = new WS("@routes.Application.chat(username).webSocketURL()") 

    var sendMessage = function() { 
    chatSocket.send(JSON.stringify(
     {text: $("#talk").val()} 
    )) 
    $("#talk").val('') 
    } 

    // ... 

因此,在你的代碼,你可以使用類似

var sock = new WS("@routes.Application.sockHandler().webSocketURL()"); 

我個人不喜歡交織插入代碼JS,因爲我認爲,任何在客戶端上執行的代碼應該只關注客戶端的狀態,而不是服務器(更不用說它使得腳本無法重構爲外部文件),所以我傾向於這樣做:

<div class="container app-container" 
    data-ws-uri="@routes.Application.WSUri.webSocketURL()"> 
....... 
</div> 

然後在我的JS我可以做一些像

var sock = new WS(document.querySelector(".app-container").dataset.wsUri); 
// .... 
+0

由於某些原因webSocketURL()不適用於Play 2.1。當我把它放在我得到這個錯誤,說它找不到請求頭。在Play 2.1 ... – user2196112 2013-04-11 15:46:20

+0

中必須有更好的方法來處理這些URL:跟在這個上面:在你的模板的頂部,你需要有@(隱含的請求:RequestHeader)'這將允許它爲你工作。不幸的是播放是有點鬆散在記錄這...編輯:我其實認爲你必須顯式傳遞請求。這就是我在我的代碼中做的,它的工作原理。 – 2013-04-12 00:55:21

+0

嗯...我試過它像這樣:'var sock = new WS(「@ routes.Application.sockHandler()。webSocketURL(request)」);'但它給了我一個錯誤說沒有找到:價值請求 – user2196112 2013-04-12 18:56:35