2013-05-17 5 views
7

Play 2.1でWebソケットを使用する方法を学習しようとしています。アプリのルーティング設定で動作するWebソケットURLを取得できません。私は新しいPlayアプリケーションとPlay framework documentation on websocketsから始めました。ここで基本PlayフレームワークのルーティングとWebソケットの例

は私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です)。

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

を私は@routes.Application.wstest.webSocketURL()@routes.Application.wstestと私のWebSocket URLを交換しようとした:このように、私はプレイフレームワークが付属していますsample/scala/websocket-chatアプリを見ていた、そしてそれは、WebSocketを参照するために、ルーティング設定ファイルを使用しています。最初のものはコンパイルされません。 2つ目はコンパイルされますが、クライアントとサーバーはメッセージを交換しません。

Playルーティング設定を使用してこのWebSocketにアクセスするにはどうすればよいですか?私はここで間違って何をしていますか?


編集

ここに私のコンパイルエラーのスクリーンショットで、「ここでは任意のHTTPリクエストヘッダを見つけることができません」:

compilation-error

答えて

6

コンパイルエラーがなければ、推測するのは難しいです何が問題だろうか。

暗黙的な要求(例:@routes.Application.wstest().webSocketURL())のために括弧を使用するか、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はです範囲。

関連する問題