Mojolicious 2のWebSocketではon_finish(sub{});がないので、on(frame=>sub{});で対応してみた
スポンサードリンク
今動かしている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]
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3782





![: Amazon.co.jp: プラスティック・メモリーズ 1【完全生産限定版】(イベントチケット優先販売申込券付) [Blu-ray]](/lists/_9/B00VWX66E8.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 2【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66K2.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 3【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6MV0.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 4【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66IO.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 5【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6Y0E.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 6【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX69D6.jpg)


コメントする