3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Herokuで思うように動かないWebSocketのサンプルたち

Posted at

JavaWebSockets(本家のサイト!)とかWebsockets in Play 2.0 - Blueprint Forge.とかのサンプルコードがスッキリ動いてくれなくて激しくハマったのでメモ。

コントローラ
public static WebSocket<String> index() {
  return new WebSocket<String>() {
      
    // WebSocket のハンドシェイクが完了すると呼ばれます。
    public void onReady(WebSocket.In<String> in, WebSocket.Out<String> out) {
      
      // ソケットで受け取ったイベント毎に
      in.onMessage(new Callback<String>() {
         public void invoke(String event) {
             
           // コンソールにイベントのログを出力する
           println(event);  
             
         } 
      });
      
      // ソケットが閉じた時
      in.onClose(new Callback0() {
         public void invoke() {
             
           println("Disconnected")
             
         }
      });
      
      // 単一の `Hello!` というメッセージを送る
      out.write("Hello!");
      
    }
    
  }
}

WebSocket のハンドシェイクが完了すると呼ばれるらしいonReadyの中で、WebSocketの入力チャンネルにonMessageonCloseのハンドラを設定し、出力チャンネルのwriteでクライアントにWebSocket通信を試みているコード。

これがHerokuだと思うように動かない。localhostでは動く。

'動かない'というのは、

out.write("Hello!");

でWebSocketの出力チャンネルに書き込んだハズなのに、クライアント側のJSのWebSocketオブジェクトのonmessageイベントがfireされないということ。

localhostでは、クライアントのonmessageはすぐに反応するが、Herokuに配置したアプリケーションでは、onmessageはいつまでたっても反応せず、サーバとの通信がないまま55秒経ってしまうと、Herokuのタイムアウトに引っ掛かってWebSocketが断絶してしまう。さらに不思議なことに、その際、上記out.write("Hello!");で書き込んでいた内容が、突然onmessageでキャッチされる。out.writeは決して書き込み失敗したのではなく、何故か待ち状態になってしまっているように思われる。

##解決策
onReadyの中でout.writeしない

onReadyはハンドシェイクが完了したら呼ばれる、と書いてあるが、これがイマイチ釈然としない。out.writeをするということは、できたばっかりのWebSocketのoutを使って通信をするということであるが、これがうまくいっていない模様。ハンドシェイクが'本当に'完了する前にoutを使ってしまい、そこで処理が止まってしまっているのではないだろうか。試しにout.writeを取り除いてみると、思った通りの、定義通りの挙動をするようになった。onReadyの中で無理にクライアントに通信を返す必要は特段ないので、今後はこのような対応を取ることにする。しかしAPIリファレンスが貧弱で困る。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?