2013-05-17 14 views
7

我試圖學習如何使用網絡套接字在播放2.1,我無法獲得Web套接字URL與我的應用程序的路由配置工作。我從一個新的Play應用程序和Play framework documentation on websockets開始。基本的播放框架路由和網絡套接字示例

這裏是我的conf/routes

# Home page 
GET /    controllers.Application.index 

# Websocket test site 
GET /wstest   controllers.Application.wstest 

然後,我添加了wstest功能到我的控制器類:

object Application extends Controller { 

    def index = Action { 
    Ok(views.html.index("Websocket Test")) 
    } 

    def wstest = WebSocket.using[String] { request => 
    // Log events to the console 
    val in = Iteratee.foreach[String](println).mapDone { _ => 
     Logger.info("Disconnected") 
    } 

    // Send a single 'Hello!' message 
    val out = Enumerator("Hello!") 

    (in, out) 
    } 
} 

然而,到目前爲止,我只能用URL ws://localhost:9000/wstest訪問的WebSocket(使用示例代碼websocket.org/echo.html)。我一直在尋找在sample/scala/websocket-chat應用程序自帶的播放框架,它使用路由配置文件,以引用的WebSocket,就像這樣:

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

我試着用@routes.Application.wstest.webSocketURL()@routes.Application.wstest更換我的WebSocket URL。第一個不編譯。第二個編譯,但客戶端和服務器不交換任何消息。

如何使用我的播放路由配置訪問此websocket?我在這裏做錯了什麼?


編輯

這裏是我的編譯錯誤的截圖,「不能在這裏找到任何請求頭」:

compilation-error

回答

6

沒有編譯器錯誤很難猜測可能是什麼問題。

因爲隱式請求,即@routes.Application.wstest().webSocketURL(),您必須使用parens,或者您在webSocketURL調用所需的作用域中沒有隱式請求。

+0

感謝您的提示。我添加了編譯錯誤的截圖。 –

+0

是的,在這種情況下,模板中缺少隱式請求,只需使用'(隱式請求:RequestHeader)'添加另一個參數列表。 –

2

馬呂斯說得對,沒有隱含的請求範圍。以下是如何得到它的範圍:

更新index功能控制器:

def index = Action { implicit request => 
    Ok(views.html.index("Websocket Test")) 
} 

的咖喱參數添加請求index.scala.html

@(message: String)(implicit request: RequestHeader) 

@main(message) { 

<script> 
    var output; 
    function init() { 
     output = document.getElementById("output"); 
     testWebSocket(); 
    } 
    function testWebSocket() { 
     websocket = new WebSocket("@routes.Application.wstest.webSocketURL()"); 
    . 
    . 
    . 

而且現在RequestHeader是範圍。