2013-05-19 144 views
1

我的應用程序有一個包含StringGrid的服務器表單。服務器只允許同時連接4個客戶端。它將在列表未滿時從客戶端添加任何tcp連接。在Delphi中檢測TCP連接/斷開連接

當新客戶端向服務器請求TCP連接並且列表已滿時,服務器應檢查此列表中的客戶端以確定它們是否仍處於連接狀態。如果客戶端仍然連接並且列表已滿,請拒絕新客戶端。如果一個或多個客戶端不再連接,請接受新客戶端,將其添加到列表中並更新列表。

如何知道客戶端仍連接?

+2

爲什麼?爲什麼只有4個客戶?爲什麼拒絕爲他人提供服務?他們在這期間應該做什麼?爲什麼在沒有存在的情況下創建問題TCP服務器可以處理數千個連接。爲什麼四個? – EJP

+0

同http://stackoverflow.com/questions/16621273/tcpserver-client-delphi – mjn

回答

1

兩個解決方案:

  • 您添加到協議的概念「客戶標識符」
  • 你決定一個「客戶」是由它的IP地址識別(插座給它給你)。
+0

avery客戶端具有唯一的ip地址 – Mohammad

1

它將基本上取決於您的應用程序和什麼使客戶端獨特。檢測唯一客戶端的一種方法是客戶端IP地址。如果多個客戶端可以使用相同的IP地址進行連接,則需要爲每個客戶端分配一個唯一的Id,然後在連接到服務器時,客戶端需要將其客戶端ID傳遞給將存儲該客戶端的服務器,並在新連接進行驗證時進行驗證。

+0

avery客戶端具有唯一的ip地址 – Mohammad

6

當新客戶想要連接時,您不應該檢查死客戶端。您應該將服務器的MaxConnections屬性設置爲4,以防止列表已滿時的新連接,而不管已連接的客戶端的狀態如何,然後在使用協議級別的心跳線或tcp級別保持連接時,定期檢查死客戶端。如果心跳/存活錯誤或超時,斷開該客戶端並將其從列表中刪除,從而允許新客戶端連接。

+0

客戶端連接到服務器成功後,然後斷開連接,所以我不能使用MaxConnections – Mohammad

+4

它們在連接後斷開,但您想將它們留在列表中?這沒有什麼意義。請更新您的問題以清除您的服務器的實際要求。 –