2014-05-23 27 views
2

我想知道是否有辦法以某種方式ping或發送一個空的請求,以便查看給定服務器的響應(以及它的響應時間)與delphi中的TIdTCPClient - 我試過的是這個:如何檢測服務器是否響應使用TIdTCPClient的請求?

TCPClient := TIdTCPClient.Create(nil); 
responseStream := TMemoryStream.Create; 
TCPClient.Host := someHost; 
TCPClient.Port := somePort; 
TCPClient.Connect; 
startTime := Ticks; 
TCPClient.IOHandler.ReadStream(responseStream, -1, True); 
respTime := GetTickDiff(startTime, Ticks); 
TCPClient.Disconnect; 

在這個僞我成功地連接到,某:somePort但顯然我沒有使用正確TCPClient.IOHandler.ReadStream - 有人可以幫我解決我的代碼(我真的要使用TIdTCPClient)或告訴我如何更換行不正常?

+0

爲什麼你認爲你沒有正確使用它?會發生什麼,你預期會發生什麼? –

+0

@Rob在行'TCPClient.IOHandler.ReadStream(responseStream,-1,True);'我的程序崩潰了,我不知道爲什麼。 –

+0

究竟是什麼樣的崩潰?請更具體一些。此外,您正在設置'AReadUntilDisconnect = True',所以'ReadStream()'將保持讀取數據,直到服務器關閉連接。 –

回答

1

TCP中沒有空的請求(UDP中有)。如果要發送請求到TCP服務器,請求必須包含一些數據。此外,您連接的特定服務器類型決定了您可以發送給它的請求類型,您不能只是連接併發送任何您想要的內容(可以,但這並不能保證您會得到響應)。

您的代碼當前的工作方式是,它只能讀取向客戶端發送初始問候語的服務器的數據。大多數服務器不這樣做。您從給定服務器獲得響應的能力取決於該服務器實現的特定協議(HTTP vs FTP vs POP3 vs SMTP vs IMAP vs ...),因爲它是指示請求和響應如何工作的協議。

所以作爲你的問題的立場,它是不應答的,因爲它太通用了,有太多的可能性。你需要縮小它。

+0

我在想同樣的事情,但我預計每種類型的服務器都會有辦法以某種方式迴應indy的圖書館客戶之一。現在我確定知道它取決於服務器如何處理請求 - 再次 - 感謝詳細的答案Remy :) –

相關問題