2012-06-07 19 views
6

我仍然習慣Indy,它是一個具有豐富功能的多線程套接字系統。我看到的一個重要的事情是服務器套接字如何可以有多個不同的綁定。例如,您可以在同一IP地址上爲3個端口綁定3個綁定。我在Delphi XE2上使用Indy 10。與印TIdTCPServerTIdTCPClient使用Indy Server的多個綁定作爲單獨的套接字?

我重樓我的一個老系統從ScktComps使用老式的TServerSocketTClientSocket部件,並重新做。舊的系統實際上由兩個完全不同的服務器/客戶端套接字組成,每個套接字服務於不同的目的,並且一起工作 - 類似於FTP如何使用一個套接字用於二進制數據,而另一個套接字用於命令。

是否有可能使用這些綁定在同一個組件中模擬三個單獨的服務器/客戶端套接字?如果我可以聲明一個綁定了3個端口的服務器套接字,並且在客戶端上同樣連接到服務器上的3個不同端口,那將是非常好的。我所要做的就是不再需要創建3個獨立的服務器/客戶端套接字組件,並將它們合併爲一個。

回答

12

是的,您可以使用一個TIdTCPServer一次管理多個端口。但是,在客戶端,您仍然需要3個不同的客戶端組件連接到不同的端口。

TIdTCPServer.Bindings集合中創建3個條目,其中一個用於您要收聽的每個本地IP /端口,其中TIdSocketHandle.Port屬性將等於TServerSocket.Port屬性。 TServerSocket本身不支持綁定到特定IP(儘管可以通過一些手動工作完成),但TIdSocketHandle.IP屬性用於此目的,其中空白字符串等同於INADDR_ANY

TIdCPServer.OnConnectTIdCPServer.OnDisconnectTIdCPServer.OnExecute事件,您可以使用TIdContext.Binding.IPTIdContext.Binding.Port性質來區分其結合呼叫套接字連接。

這樣做的一個常見用途是在不同端口上支持SSL和非SSL客戶端,例如支持不同端口上支持隱式和顯式SSL/TLS的協議,如POP3和SMTP。 TIdHTTPServer是否支持單個服務器上的HTTPHTTPS網址(您可以使用TIdHTTPServer.OnQuerySSLPort自定義哪些端口使用SSL/TLS而不是使用SSL/TLS)。

例如:

procedure TForm1.StartButtonCick(Sender: TObject); 
begin 
    IdTCPServer1.Active := False; 
    IdTCPServer1.Bindings.Clear; 

    with IdTCPServer1.Bindings.Add do 
    begin 
    IP := ...; 
    Port := 2000; 
    end; 

    with IdTCPServer1.Bindings.Add do 
    begin 
    IP := ...; 
    Port := 2001; 
    end; 

    with IdTCPServer1.Bindings.Add do 
    begin 
    IP := ...; 
    Port := 2002; 
    end; 

    IdTCPServer1.Active := True; 
end; 

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); 
begin 
    case AContext.Binding.Port of 
    2000: begin 
     // do something... 
    end; 
    2001: begin 
     // do something else... 
    end; 
    2002: begin 
     // do yet something else ... 
    end; 
    end; 
end; 
+0

真棒,只是使用它自己的線程或最有可能所有3個在同一背景下的線程每個端口疑惑? –

+1

「綁定」集合中的每個條目都在其自己的線程中運行,以接受其各自端口上的入站連接。每個接受的客戶端連接也在其自己的線程中運行。所以如果你有3個'Bindings'條目和3個連接的客戶端,那就是6個線程在運行。 –

+0

完美,這正是我想要的。 –