簡體   English   中英

Indy 10中的雙向TCP通信?

[英]Two-way TCP communication in Indy 10?

我正在使用TIdCmdTCPClient和TIdCmdTCPServer。 突然間,我發現我想進行雙向通信。

什么是最好的? 我是否應該使用其他組件? 如果是這樣? 還是我應該笨拙地讓“客戶”對“服務器”進行調查,以詢問是否希望進行任何通信?

這是一個非常小的系統。 兩個客戶端和十個服務器,每天一次,幾分鍾一次,每30到60秒爆發一次,因此輪詢的開銷是無關緊要的。

如果有一種“正確”的方法,我只是混蛋。


更新:這確實是一個非常簡單的系統。 流量很少,而且一切都很簡單。 所有傳輸均指示偶數類型(可選的單個參數)。

<event type> [ <parameter>]例如"HERE_IS_SOME_DATA 42"

可以雙向發送,懸停在這里並不是“回復”。 只是開出一條消息(並希望它到達那里)? 收到沒有數據的確認? 未捕獲到異常表示消息已成功發送?)

使用兩個TIdCmdTCPServer是否可能(會過大)?

在連接有效期內, TIdCmdTCPClientTIdCmdTCPServer連續輪詢其套接字端點以獲取入站數據。 您不必為此額外做任何事情。 因此,一旦TIdCmdTCPClient連接到TIdCmdTCPServer ,兩個組件將首先處於讀取狀態,直到其中一個組件向TIdCmdTCPServer組件發送命令為止。

現在,這樣做有一個問題-任何一個組件發送第一個命令,接收組件都會將其解釋為命令並發送回一個答復,另一個組件會將其解釋為命令並發送回一個答復,它將被解釋為命令並發回答復,依此類推,導致無休止的來回答復循環。 因此,同時使用TIdCmdTCPClientTIdCmdTCPServer是不明智的。 您應該將TIdTCPClientTIdCmdTCPServer使用,或者將TIdCmdTCPClientTIdTCPServer TIdCmdTCPClient使用。 根據您的協議的確切外觀,可能必須完全放棄使用TIdCmdTCPClientTIdCmdTCPServer而僅將TIdTCPClientTIdTCPServer一起使用,這樣您就可以更好地控制兩端的讀寫。 在不首先知道通信協議是什么樣的情況下,很難用實際的代碼來回答。

單個TCP套接字連接可以在兩個方向上使用。 服務器可以隨時將數據異步發送到客戶端。 但是,由客戶端決定是否讀取套接字,對於異步處理,這是在偵聽器線程中完成的,該偵聽器線程從套接字讀取並將輸入的數據操作與主工作線程同步。

Indy組件中的一個示例用例是Telnet客戶端組件(TIdTelnet),該組件具有一個偵聽服務器消息的接收線程。

但是您還詢問了“正確”的方法-然后答案取決於其他因素,例如網絡穩定性,保證的交付以及如何處理服務器臨時中斷。 在企業環境中,在許多使用情況下,最好使用一個中央消息傳遞中心,以便所有各方僅連接到該中央服務器,該中央服務器僅負責可靠的消息傳遞,並保留消息直到收件人可用為止。

您可以在此處下載INDY 10 TCP server演示示例代碼。

暫無
暫無

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

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