2016-03-28 11 views
4

Ich folge den Anweisungen in der offiziellen Dokumentation des Spiels Rahmen 2.5.x auf Java Websockets, habe ich einen Controller mit dieser FunktionPlay-Framework 2.5.x WebSocket Java

public static LegacyWebSocket<String> socket() { 
    return WebSocket.withActor(MyWebSocketActor::props); 
} 

und ein Schauspieler Klasse MyWebSocketActor:

public class MyWebSocketActor extends UntypedActor { 

    public static Props props(ActorRef out) { 
     return Props.create(MyWebSocketActor.class, out); 
    } 

    private final ActorRef out; 

    public MyWebSocketActor(ActorRef out) { 
     this.out = out; 
    } 

    public void onReceive(Object message) throws Exception { 
     if (message instanceof String) { 
      out.tell("I received your message: " + message, self()); 
     } 
    } 
} 

Dann ist die App gestartet ich versuche, bei ws zu verbinden: // localhost: 9000, wie in der offiziellen Dokumentation steht geschrieben:

Tip: You can test your WebSocket controller on https://www.websocket.org/echo.html . Just set the location to ws://localhost:9000.

Aber der Web-Socket scheint unerreichbar, wie kann ich es testen?

Dank

+0

Sind Sie in der Lage zu verbinden und keine Nachrichten senden oder Sie können nicht überhaupt an? Wie ist deine 'routes' Datei definiert? Hast du deine Entwicklerkonsole in deinem Browser angeschaut - was sagt die Netzwerkkarte? Sie können auch versuchen, einen Test-Client mit dem Beispiel auf websocket.org/echo.html zu erstellen - damit Sie das Cross-Server-Szenario beseitigen – Anton

+0

Ich kann überhaupt keine Verbindung herstellen und in meiner Route-Datei habe ich keine Route zu Socket-Methode definiert Muss ich es hinzufügen? Wenn ich versuche, unter ws: // localhost: 9000 in https://www.websocket.org/echo.html in der Konsole eine Verbindung herzustellen, erscheint: SecurityError: Die Operation ist unsicher. Wenn ich versuche, Use secure WebSocket (TLS) im Logbereich zu überprüfen, erscheint ERROR: undefined und DISCONNECTED –

Antwort

2

Um WebSocket-Verbindungen zu behandeln, haben Sie auch eine Route in Ihrer routes Datei hinzuzufügen.

GET /ws controllers.Application.socket()

Dann wird Ihr WebSocket Endpunkt ws://localhost:9000/ws sein - mit dem Echo-Service zum Testen verwenden.

+0

Danke Anton, ich folgte deinem Vorschlag, aber wenn ich zu "http: // localhost: 9000/ws" gehe, bekomme ich das Nachricht _Upgrade auf WebSocket erforderlich_. Und ich kann keine Verbindung zum Web-Socket von http://websocket.org/echo.html herstellen. Ich verstehe nicht, warum es so schwierig ist, in Play eine Websocket zu erstellen. Hast du andere Vorschläge? –

+0

Schließlich löste ich es, entfernen Sie statische von socket() -Methode und fügen Sie Endpunkt, wie Anton vorschlagen, in Routen Datei, dann starten Sie die Anwendung mit SSL/TLS, zum Beispiel Aktivator run -Dhttps.port = 9443, an dieser Stelle point einfügen wss: // localhost: 9443/ws in Location-Feld auf https://websocket.org/echo.html und es verbindet sich mit dem Web-Socket. –

+0

'wss' ist das WebSocket Secure-Protokoll. Sie müssen es nicht verwenden, wenn Sie nicht möchten, können Sie immer noch nur 'ws' verwenden.Sie sehen das 'Upgrade auf WebSocket erforderlich ', weil Sie versuchen, eine Verbindung zum WebSocket-Endpunkt direkt mit Ihrem Browser herzustellen. Sie müssen dies jedoch von einem Client aus tun, beispielsweise in JavaScript (als Echo-Dienst) oder einem anderen Dienst. – Anton

2

Endlich mit Hilfe von Anton habe ich es gelöst! Erstens: von socket() Methode

public LegacyWebSocket<String> socket() { 
     return WebSocket.withActor(MyWebSocketActor::props); 
    } 

einen Endpunkt in Routen-Datei für die Buchse() -Methode

GET  /ws       controllers.HomeController.socket() 

An dieser Stelle dann statisch entfernen fügen Sie die Anwendung mit SSL/TLS anfangen auf diese Weise, zum Beispiel:

activator run -Dhttps.port=9443 

in websocket.org/echo.html Einsatz wss://localhost:9443/ws in Feld Standort und es verbindet sich mit WebSocket!

Außerdem, wenn ich https://localhost:9443/ws besuche ich weiterhin die Nachricht erhalten

Upgrade to WebSocket required

+1

Nur eine Information über das Entfernen von 'static': das ist der Weg in Play 2.4, Play 2.5 und für die Zukunft - Teil der Idee, den globalen Status zu entfernen und Dependency Injection zu verwenden – Anton