2016-03-28 51 views
4

我下面玩框架2.5.X到Java的WebSockets的官方文檔中的說明,我創建了這個功能播放框架2.5.X web套接字的Java

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

而一個演員類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()); 
     } 
    } 
} 

然後應用程序被啓動之後我試圖WS連接://本地主機:9000作爲被寫入正式文件:

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

但網絡套接字似乎無法訪問,我該如何測試它?

感謝

+0

您能夠連接,而不是發送消息或您無法連接呢?你的'routes'文件是如何定義的?您是否在瀏覽器中查看過您的開發人員控制檯 - 網絡選項卡說什麼?您也可以嘗試使用websocket.org/echo.html上的示例創建一個測試客戶端 - 以便消除跨服務器場景 – Anton

+0

根本無法連接,並且在我的路由文件中我沒有定義任何到套接字方法的路由,我必須添加它?當我嘗試在控制檯的https://www.websocket.org/echo.html中的ws:// localhost:9000連接時出現:SecurityError:操作不安全。如果我嘗試檢查使用安全的WebSocket(TLS)在日誌區域出現錯誤:undefined和DISCONNECTED –

回答

2

爲了處理WebSocket連接,您還可以在您的routes文件中添加的路由。

GET /ws controllers.Application.socket()

那麼你的WebSocket端點將ws://localhost:9000/ws - 使用它與回聲服務測試。

+0

謝謝安東,我遵循你的建議,但是當我去'http:// localhost:9000/ws'時,我得到這個消息_升級到WebSocket required_。而且我無法連接到http://websocket.org/echo.html的網絡套接字。我不明白爲什麼在Play中創建WebSocket非常困難。你有其他建議嗎? –

+0

最後我解決了它,從socket()方法中刪除靜態並添加終結點,如路由文件中的Anton所示,然後使用SSL/TLS啓動應用程序,例如激活運行-Dhttps.port = 9443,在https://websocket.org/echo.html上的位置字段中插入wss:// localhost:9443/ws,並將其連接到Web套接字。 –

+0

'wss'是WebSocket安全協議。如果你不想使用它,你不需要使用它,你仍然可以只使用'ws'。由於您嘗試直接使用瀏覽器連接到WebSocket端點,因此您會看到「需要升級到WebSocket」,但您必須從某個客戶端執行此操作,例如使用JavaScript(作爲echo服務)或其他服務編寫。 – Anton

2

終於在安東的幫助下,我解決了它! 第一:請從插座靜態的()方法

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

然後加入航線文件端點套接字()方法

GET  /ws       controllers.HomeController.socket() 

在這一點上,你必須開始使用SSL/TLS的應用以這種方式,例如:

activator run -Dhttps.port=9443 

在位置字段中插入websocket.org/echo.htmlwss://localhost:9443/ws它連接到的WebSocket!

而且如果我訪問https://localhost:9443/ws我繼續獲得消息

Upgrade to WebSocket required

+1

只是一個關於'static'的消息:這是在Play 2.4,Play 2.5和未來的方法 - 去除全局狀態並使用依賴注入的想法的一部分 – Anton