いろいろ備忘録

雑記です。

onClosed vs onClosing in OkHttp3のWebSocketクラス

【結論】

onClosing()は成功でも失敗でもとりあえず実行される。

onClosed()は切断が成功した場合実行される。向こう側から一方的に閉じられた場合は実行されない。

順序はonClosing()の後にonClosed()

 

 

onClosed()はRealWebSocket#onReadClose()で呼ばれます。

if (toClose != null) {
listener.onClosed(this, code, reason);
}

このtoCloseは

if (enqueuedClose && messageAndCloseQueue.isEmpty()) {
toClose = this.streams;

これです。enqueuedCloseはclose()が呼ばれた時点で真になります。偽が代入される行はありません。
messageAndCloseQueueは、送信のキューです。send()で送信されるMessageや、close()でCloseがaddされます。writeOneFrame()でデキューと送信が行われます。

つまり、close()を実行している、かつ送信待ちキューがなくなっている、かつ向こうから切断要求・応答(Closeフレーム)が送られて来た時のみonClosed()は呼ばれます。

 

Closeフレームについてはこちら。

WebSocketについて調べてみた。 - Nao Minami's Blog