在未做任何代碼變更的情況下,出現(xiàn)了斷開(kāi)連接無(wú)法觸發(fā)onClose的情況,過(guò)了1個(gè)多小時(shí)又好了
流程如下:
1.殺死APP,過(guò)了大概9秒才出現(xiàn)onclose的調(diào)用(測(cè)試結(jié)果證實(shí)是由心跳觸發(fā),心跳檢測(cè)為4秒的時(shí)候8、9秒觸發(fā)onclose,設(shè)置為30秒的時(shí)候大概一分鐘觸發(fā)onclose),反復(fù)測(cè)試都是這個(gè)結(jié)果
2.經(jīng)過(guò)多次重啟之后還是只能由心跳觸發(fā)onclose,問(wèn)題沒(méi)有解決
3.在只是調(diào)整日志打印的代碼情況下,又突然好了,能夠在殺死app的時(shí)候馬上觸發(fā)onclose了,不知道為什么
4.測(cè)試方法:tail -f -n 100 stdout.log,然后將APP不停的打開(kāi)再殺掉,在某段時(shí)間里,都不能直接觸發(fā)onclose
中途重啟過(guò)多次php start.php restart,一直沒(méi)好,在某一次測(cè)試的時(shí)候突然就好了,后續(xù)都好了,所以不知道跟重啟有沒(méi)有關(guān)系,很困擾,害怕再次出現(xiàn),代碼改動(dòng)只增加了var_dump作為調(diào)試
還有就是你可能再快心跳的時(shí)候殺了app,所以下一秒心跳就給你斷開(kāi)了,你感覺(jué)很快,找個(gè)邏輯沒(méi)有問(wèn)題,你要馬上觸發(fā),只有改心跳時(shí)間,越短越快
我表述不清,心跳斷開(kāi)鏈接我明白,但是心跳是在斷網(wǎng)等情況下才用心跳檢測(cè)健全,像我這種殺死應(yīng)用應(yīng)該是能馬上捕捉到socket連接斷開(kāi)才對(duì)(之前都是的,現(xiàn)在出現(xiàn)了不能捕捉到連接斷開(kāi),應(yīng)該是能捕捉到斷開(kāi)連接的什么fan包的)
我發(fā)現(xiàn)了造成的原因,無(wú)意間試出來(lái)的,當(dāng)我開(kāi)著移動(dòng)網(wǎng)絡(luò)和wifi的時(shí)候,我頻繁的開(kāi)關(guān)wifi,然后就會(huì)導(dǎo)致后面的onclose都要等心跳檢測(cè)才會(huì)觸發(fā),不知道什么原因
你糾結(jié)找個(gè)onclose 意義不大,自己后端代碼判斷清楚就行了,防止一個(gè)app 重復(fù)建立多次鏈接就行
Kill掉應(yīng)用不會(huì)主動(dòng)觸發(fā)或者說(shuō)立即服務(wù)器的onClose,因?yàn)榉?wù)器不知道
@@walkor 為什么我兩臺(tái)手機(jī),一臺(tái)手機(jī)殺死APP能馬上觸發(fā)onClose(心跳4秒,經(jīng)過(guò)多次測(cè)試都是殺死應(yīng)用瞬間觸發(fā)onClose,非巧合),另外一臺(tái)手機(jī)用同樣的方式殺死APP,卻不會(huì)瞬間觸發(fā)onClose,必須等到心跳檢測(cè)才觸發(fā)。
說(shuō)個(gè)不可理解的現(xiàn)象,就是多次測(cè)試得出一個(gè)現(xiàn)象:殺死應(yīng)用瞬間觸發(fā)onClose的那臺(tái)手機(jī)處于充電狀態(tài),如果拔掉充電,則再測(cè)試不會(huì)瞬間觸發(fā)onClose
這個(gè)不是服務(wù)端問(wèn)題,是否及時(shí)觸發(fā)onClose取決于手機(jī)端在殺死app時(shí)是否及時(shí)發(fā)送了fin包給服務(wù)端。沒(méi)發(fā)送fin包就只能依賴心跳檢測(cè)延遲觸發(fā)onclose。至于手機(jī)什么情況下發(fā)fin包取決于手機(jī)操作系統(tǒng)的實(shí)現(xiàn)。