服務(wù)端未完全啟動時, client連接失敗后調(diào)用reconnect后,雖然connect成功的,但是發(fā)送數(shù)據(jù)服務(wù)端并不能接收到,這是為什么?
?
在onClose中我應(yīng)該怎么寫才能保證接下來發(fā)送數(shù)據(jù)能成功呢?
給你個樣板代碼,照貓畫虎吧:
<script type="text/javascript">
var ws, timer_id1, time_id2;
//連接服務(wù)端
function connect() {
//創(chuàng)建websocket
ws = new WebSocket("ws://"+document.domain+":8888");
//當(dāng)socket連接打開時
ws.onopen = onopen;
//當(dāng)有消息時根據(jù)消息類型顯示不同信息
ws.onmessage = onmessage;
ws.onclose = function(e) {
console.log("連接關(guān)閉,定時重連");
timer_id1 = setInterval(function(){
connect();
}, 5000);
timer_id2 && clearInterval(timer_id2);
};
ws.onerror = function() {
console.log("出現(xiàn)錯誤");
};
//客戶端主動發(fā)送心跳
var timer_id2 = setInterval(function(){
console.log("客戶端定時發(fā)送心跳包");
ws.send('{"type":"ping"}');
}, 20000);
}
//連接建立時發(fā)送數(shù)據(jù)
function onopen() {
timer_id1 && clearInterval(timer_id1);
ws.send('some data...');
}
//服務(wù)端發(fā)來消息時
function onmessage(e){
}
</script>
利用timer重連,確實(shí)是一種方案,我目前用的是這種。情況是這樣的,原來我的server是繼承自Worker的自定義類,客戶端通過異步方式連接上來,在onconnect里連接成功后,不會被斷開。但是現(xiàn)在用的server是gatewayworker中的Gateway類,客戶端在第一次onconnect后,會被gateway close(因?yàn)間ateway可能未完全啟動好),然后客戶端再次發(fā)起重連,這時連接上后就不會被close了!
所以想知道gateway的設(shè)計(jì)是否本來就是這樣的!?
對于發(fā)起異步連接時,確實(shí)會存在gateway服務(wù)尚未來得及啟動而導(dǎo)致連接不上,所以需要客戶端重連,但是默認(rèn)情況下客戶端連接是不會被 gateway close掉的,除非gateway設(shè)置 $gateway->pingInterval > 0 并且 $gateway->pingNotResponseLimit > 0,這個代表客戶端若連續(xù)$pingNotResponseLimit次$pingInterval時間內(nèi)不發(fā)送任何數(shù)據(jù),則服務(wù)端會強(qiáng)行斷開鏈接。
@614:我這種情況一定不是你說的這種了。因?yàn)橥ㄟ^最外層的start.php把gateway和client同時起來的,所以如果gateway未完全啟動,而這時客戶端就向gateway發(fā)起了異步連接請求,我是在onClose中檢測到的,所以不知道是不是gateway主動關(guān)閉連接,但可以確定的是進(jìn)來了onClose回調(diào)了!所以想來問問為什么會進(jìn)入onClose?