我的意思是,你的解決方案可以工作,但我看不出有什麼理由不能使用更多的帶內控制機制。試試這個,在服務器上只有一個插座:
List connections contains pairs (client, lastPacketTime)
Socket is a single UDP Socket
Thread 1 Loop:
Get new UDP Datagram P From Socket
If P.client in List:
update lastPacketTime
Else:
add P.client to list
If P is not Ping datagram:
Do other operations on P
Thread 2 Loop:
For client in List with lastPacket time 3-10 Seconds ago:
send ping request via Socket
For client in List with lastPacket time > 10 Seconds ago:
Mark client as down.
Sleep for some time
這在客戶端上:
Loop:
If I have data to send:
Send it!
Else if I have a ping request in my UDP Socket:
Send Ping datagram
Else
Sleep for some time.
如果你需要比這更可靠的握手,你可能會考慮只打開一個TCP連接服務器旁邊的UDP的東西。然後服務器可以使用TCP連接來檢查活躍性。我必須誠實地說,當人們嘗試做面向連接的UDP時,我的脖子後面的頭髮站立起來。如果你擔心所有的處理和ping時間更新,您可以添加第三個線程:
List contains pairs (client, lastPacketTime)
Queue contains Datagrams with time updates.
Socket is a single UDP Socket
Thread 1 Loop:
Get new UDP Datagram P from Socket
Add P to Queue
If P is not Ping datagram:
Do other operations on P
Thread 2 Loop:
Get new Datagram P from Queue
If P.client in List:
update lastPacketTime
Else:
add P.client to list
Thread 3 Loop:
For client in List with lastPacket time 3-10 Seconds ago:
send ping request via Socket
For client in List with lastPacket time > 10 Seconds ago:
Mark client as down.
Sleep for some time
這似乎是一個TCP的情況...有沒有您選擇使用UDP理由嗎? – FrankieTheKneeMan
@FrankieTheKneeMan:謝謝你的迴應。 是的,我的主管被迫使用UDP,因爲我正在開發的項目可能會造成一些數據丟失,我的偏好是速度超過可靠性,這就是我選擇UDP的原因。 – Ayse
那麼,您當前的數據流大部分來自客戶端到服務器?如果沒有通信,您只需定期ping客戶端?我不確定你需要兩個插座。 – FrankieTheKneeMan