客戶端與Gateway進(jìn)行websocket長連接的情況下,
設(shè)置了pingInterval=30,pingNotResponseLimit=0,
這種情況下,客戶端會穩(wěn)定連接著,
但如果設(shè)置了pingNotResponseLimit > 0,等于1至等于5都試過,
就會在 30 * pingNotResponseLimit時斷開鏈接;
防火墻是關(guān)著的,所以不會受防火墻的影響,本以為可能是服務(wù)器環(huán)境問題,
后來重新搭建了個新的環(huán)境,只跑PHP和相關(guān)依賴,也同樣出現(xiàn)這個情況;
請問下還有什么因素會導(dǎo)致這種情況;例如keepalive?
Gateway::$pingInterval
服務(wù)端向客戶端發(fā)送心跳數(shù)據(jù)的時間間隔 單位:秒。如果設(shè)置為0代表不發(fā)送心跳檢測
Gateway::$pingNotResponseLimit
客戶端連續(xù)$pingNotResponseLimit次$pingInterval時間內(nèi)不回應(yīng)心跳則斷開鏈接。
摘自手冊 http://doc2.workerman.net/326139
如果$pingNotResponseLimit>0,客戶端必須在$pingInterval*$pingNotResponseLimit秒時間內(nèi)發(fā)送心跳給服務(wù)端,不然服務(wù)端就認(rèn)為客戶端已經(jīng)下線,斷開鏈接。
好吧,我忘了補(bǔ)充,客戶端是有回心跳包的,并且,客戶端是做了雙向心跳包,服務(wù)器會主動發(fā)心跳包,客戶端同時也有主動心跳包機(jī)制,服務(wù)器回回心跳包,但………就是在$pingInterval*$pingNotResponseLimit后斷開連接…
心跳包數(shù)據(jù)不符合服務(wù)端協(xié)議???服務(wù)端發(fā)送的心跳包內(nèi)容是默認(rèn)的“{action:ping}”,客戶端只要回應(yīng)服務(wù)器應(yīng)該算是一個ping Ack了,這怎么說??
你可以用chrome瀏覽器f12 network里選擇ws鏈接,在Frames里看下,客戶端到底有沒有向服務(wù)端發(fā)送心跳,時間間隔是否小于服務(wù)端設(shè)置的pingInterval的值。
@1:客戶端讀超時,服務(wù)器超時時間,nginx讀超時設(shè)置的都正確,心跳間隔超過60S就有問題,期間websocket連接正常,可以收數(shù)據(jù),但是沒有心跳數(shù)據(jù)的發(fā)送。試過N次都是斷開與客戶端的連接,不是我網(wǎng)絡(luò)環(huán)境的問題,因?yàn)閟ocket還連著,雙方仍然能收到數(shù)據(jù),就是不心跳。