2013-05-17 5 views
7

Próbuję nauczyć się korzystać z gniazd internetowych w wersji 2.1 i mam problemy z uzyskaniem adresu URL gniazda sieciowego do pracy z konfiguracją routingu mojej aplikacji. Zacząłem od nowej aplikacji Play i Play framework documentation on websockets.Podstawy routingu i gniazd internetowych gier podstawowych

Oto mój conf/routes:

# Home page 
GET /    controllers.Application.index 

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

Potem dodałem funkcję wstest do mojej klasy kontrolera:

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) 
    } 
} 

Jednak, jak dotąd, nie mogę przejść tylko websocket z adresem URL ws://localhost:9000/wstest (przy użyciu przykładowego kodu pod numerem websocket.org/echo.html). Szukałem w aplikacji sample/scala/websocket-chat że pochodzi z ramami Play i używa pliku konfiguracyjnego routingu do odniesienia websocket, tak:

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

Próbowałem zastępując mój websocket URL z @routes.Application.wstest.webSocketURL() i @routes.Application.wstest. Pierwszy nie kompiluje się. Drugi kompiluje, ale klient i serwer nie wymieniają żadnych wiadomości.

Jak korzystać z konfiguracji routingu w Play, aby uzyskać dostęp do tego websocket? Co ja tu robię źle?


Edit

Oto zrzut ekranu z mojego błędu kompilacji, "Nie można znaleźć żadnego żądania HTTP Header tutaj":

compilation-error

Odpowiedz

6

Bez błędu kompilatora trudno odgadnąć Co może być problemem.

Albo musisz używać parens z powodu niejawnego żądania, tj. @routes.Application.wstest().webSocketURL(), lub nie masz żadnego niejawnego żądania w zakresie, który jest potrzebny dla wywołania webSocketURL.

+0

Dzięki za wskazówki. Dodałem zrzut ekranu z błędem kompilacji. –

+0

Tak, w tym przypadku brakuje niejawnego żądania w szablonie, po prostu dodaj kolejną listę parametrów za pomocą '(niejawnego żądania: RequestHeader)'. –

2

Marius ma rację, że nie było żadnego niejawnego wniosku w zakresie. Oto jak je zdobyć w zakresie:

Aktualizacja funkcji w sterowniku index:

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

dodać prośbę jako curry parametru 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()"); 
    . 
    . 
    . 

A teraz RequestHeader jest w zakres.