簡體   English   中英

Socket.IO - 如何在客戶端更改超時值選項?

[英]Socket.IO - How to change timeout value option on client side?

我使用Socket.IO 0.9.16建立連接:

io.connect(url)

但是,當服務器死機時,檢測到服務器錯誤需要2分鍾的超時時間。

我已經嘗試通過設置將超時減少到5秒:

io.connect(url, {'timeout': 5000, 'connect_timeout': 5000})

但沒有成功......我怎么能這樣做?

這里面臨的挑戰是,有許多不同的設置可以相互交互,還有一些重試邏輯會使socket.io超時不是你通常所期望的。 我應該補充一點,我熟悉socket.io 1.0+,而不是0.9雖然這可能適用於兩者。

讓我們回顧一下socket.io連接的工作原理。

  1. 它試圖建立初始連接。
  2. 如果成功,那么您已完成連接。
  3. 如果該連接嘗試沒有立即返回,它將等待您在連接結果的初始選項中傳遞的timeout值。
  4. 如果您的服務器已關閉,則連接嘗試可能會很快失敗。 這將導致connect_error ,如果您在套接字上使用socket.on('connect_error', function() {...});注冊該消息socket.on('connect_error', function() {...}); ,你會看到connect_error事件。
  5. connect_error不是超時。 因此,如果連接快速失敗(通常在服務器剛剛關閉時失敗),那么您永遠不會獲得常規超時,並且傳遞給io({timeout: 5000})的超時參數io({timeout: 5000})實際上不會生效。 只有當與服務器的連接花費很長時間(例如過於繁忙的服務器或接受TCP連接的服務器,但響應速度很慢)時才會生效。 這通常不是在服務器剛剛關閉或無法訪問時發生的情況。
  6. 因此,在socket.io獲取connect_error它會標記此socket.io連接以進行重試。
  7. 重試之前的延遲基於一大堆事情。 據推測, reconnectionDelay選項是公式的一部分,但是在查看代碼時,還有一種退避算法可以延長重試之間的時間,重試次數也會增加。 因此,足以說明,有一些算法在重試之前計算給定的延遲,每次重試都會有所不同。
  8. 然后,在計算出的延遲之后,它會再次嘗試連接。 這基本上重復了從步驟1開始的過程。
  9. 我可以告訴他,默認情況下它會永遠重試。 有一個選項可以傳遞reconnectionAttempts ,指定最大重新連接嘗試次數。 如果不傳遞,則默認為無窮大。 但是,如果你通過10 ,那么它會在連續10次連接失敗后放棄。
  10. 如果指定reconnectionAttempts ,那么在多次連接嘗試失敗之后,您將在套接字上獲得reconnect_failed事件並且它將放棄。
  11. 我可以說,在你尋找連接的地方,嘗試重試,然后在x時間之后放棄時,沒有傳統的超時。 timeout選項僅適用於單次重新連接嘗試,而不適用於它一直嘗試連接的總時間。

在我一直在試驗的示例測試頁面中,我能夠實現我自己的傳統連接超時,如下所示:

var socket = io(...);

// set connect timer to 5 seconds
socket._connectTimer = setTimeout(function() {
    socket.close();
}, 5000);

socket.on('connect', function() {
    // socket connected successfully, clear the timer
    clearTimeout(socket._connectTimer);
});

無論連接嘗試進行多長時間或在該時間段內發生多次重新連接嘗試,這將成功連接最多等待5秒。 在沒有成功連接的情況下5秒后,它會關閉插座。

在我的測試應用程序中,我可以看到socket.io一遍又一遍地重試連接,直到5秒鍾后,我的計時器觸發,我收到"timeout"通知,我關閉套接字,它再次停止嘗試重試。

我認為這是connect timeout

io.connect(url, {'timeout':5000, 'connect timeout': 5000})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM