2013-05-17 3 views
7

Ich versuche zu lernen, wie man Web-Sockets in Play 2.1 verwendet, und ich habe Probleme, die Web-Socket-URL mit der Routing-Konfiguration meiner App zu arbeiten. Ich begann mit einer neuen Play-Anwendung und der Play framework documentation on websockets. HierBasic Play Framework-Routing und Web-Sockets Beispiel

ist mein conf/routes:

# Home page 
GET /    controllers.Application.index 

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

Dann habe ich die wstest Funktion meiner Controller-Klasse:

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

aber bisher habe ich nur die websocket mit der URL zugreifen können ws://localhost:9000/wstest (Verwenden des Beispielcodes unter websocket.org/echo.html). Ich war auf der Suche auf der sample/scala/websocket-chat-Anwendung, die mit dem Play Rahmen kommt, und es wird die Routing-Konfigurationsdatei die websocket zu verweisen, wie folgt aus:

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

ich mit @routes.Application.wstest.webSocketURL() und @routes.Application.wstest meine websocket URL versucht, zu ersetzen. Der erste kompiliert nicht. Der zweite kompiliert, aber der Client und der Server tauschen keine Nachrichten aus.

Wie kann ich meine Play Routing-Konfiguration verwenden, um auf diesen Websocket zuzugreifen? Was mache ich hier falsch?


bearbeiten

Hier ist ein Screenshot von meinem Kompilierungsfehler: "Kann keine HTTP-Request-Header finden Sie hier":

compilation-error

Antwort

6

Ohne den Compiler-Fehler ist es schwer zu erraten Was könnte das Problem sein.

Entweder müssen Sie Parens wegen der impliziten Anforderung verwenden, d. H. @routes.Application.wstest().webSocketURL(), oder Sie haben keine implizite Anforderung im Bereich, der für den webSocketURL-Aufruf benötigt wird.

+0

Danke für die Tipps. Ich habe einen Screenshot des Kompilierungsfehlers hinzugefügt. –

+0

Ja, in diesem Fall fehlt die implizite Anfrage in der Vorlage, fügen Sie einfach eine weitere Parameterliste mit '(implizite Anfrage: RequestHeader)' hinzu. –

2

Marius hat recht, dass es keine implizite Anfrage im Umfang gab. Hier ist, wie es in ihrem Umfang zu erhalten:

Aktualisieren Sie die index Funktion in der Steuerung:

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

Fügen Sie die Anfrage als curried Parameter 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()"); 
    . 
    . 
    . 

Und nun die RequestHeader ist in Umfang.