M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2011年11月26日 15:21

Mojolicious 2のWebSocketではon_finish(sub{});がないので、on(frame=>sub{});で対応してみた

このエントリーをはてなブックマークに追加 mixiチェック

今動かしているMojolicious::LiteでWebSocketでクライアントに表示するやつなんですけれども、Mojoliciousのバージョン1/2の両用で動くようにしていたのですが、本番のMojolicious 2の環境では、WebSocketクローズのイベントが取得できない状態になっていました。よって、こんな感じにしてみました。

  # WebSocketコネクション切断時処理(共通)
  my $on_finish = sub {
    # ログに切断記録
    app->log->debug('Client disconnected');
    # $clientsからWebSocketクライアントを削除
    delete $clients->{$id};
  };
  
  # WebSocketイベント設定
  if ( $Mojolicious::VERSION < qv("v2.0") ) {
    # Mojolicious 1.xの時の処理
    $self->on_message();
    $self->on_finish( $on_finish );
  }
  else {
    # Mojolicious 2.xの時の処理
    $self->on(
      message => sub {},
    );
    $self->on(
      frame => sub {
        my ($ws, $frame) = @_;
        if ( $frame->[1] == 8 ) { # opcode=8: close
          $on_finish->();
        }
      },
    );
  }

これを見ると、どうも frame-opcode = 9(ping)、frame-opcode=10(pong)も$ws->on(frame=>sub{}); の中で対応しなくちゃいけないのかなーとか思っていますが、調べ中……

ここを参考にした:
WebSocket(hybi-07)でechoサーバを作ってみた - いろいろな何か [d.hatena.ne.jp]

投稿 大野 義貴 [Perl] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3782

コメントする