2012-06-07 9 views
6

Ich bin immer noch daran gewöhnt, Indy, ein Multi-Threaded-Socket-System mit umfangreichen Fähigkeiten. Eines der großen Dinge, die ich gesehen habe, ist, wie ein Server-Socket eine Reihe verschiedener Bindungen haben kann. Beispielsweise könnten Sie drei Bindungen für drei Ports mit derselben IP-Adresse haben. Ich verwende Indy 10 auf Delphi XE2.Verwenden Sie die Mehrfachbindungen von Indy Server als separate Sockets?

Ich bin ein altes System von mir neu bauen, die die altmodischen TServerSocket und TClientSocket Komponenten aus ScktComps verwendet und wieder tut es mit Indy TIdTCPServer und TIdTCPClient. Das alte System besteht eigentlich aus 3 völlig unterschiedlichen Server/Client-Sockets an jedem Ende, wobei jeder Socket einen bestimmten Zweck erfüllt und zusammenarbeitet - ähnlich wie FTP einen Socket für Binärdaten und den anderen Socket für Befehle verwendet.

Ist es möglich, drei separate Server/Client-Sockets innerhalb derselben Komponente mit diesen Bindungen nachzuahmen? Es wäre großartig, wenn ich nur einen Server-Socket mit 3 Ports gebunden und auf dem Client mit 3 verschiedenen Ports auf dem Server verbunden wäre. Alles, was ich tun möchte, ist die Notwendigkeit, 3 separate Server/Client-Socket-Komponenten zu erstellen und sie zu einem einzigen zu kombinieren.

Antwort

12

Ja, Sie können eine einzelne TIdTCPServer verwenden, um mehrere Ports gleichzeitig zu verwalten. Auf der Client-Seite benötigen Sie jedoch noch 3 verschiedene Client-Komponenten, um eine Verbindung zu den verschiedenen Ports herzustellen.

Erstellen Sie 3 Einträge in der TIdTCPServer.Bindings Sammlung, eine für jede lokale IP/Port, die Sie hören möchten, wobei die TIdSocketHandle.Port Eigenschaft das Äquivalent der TServerSocket.Port Eigenschaft wäre. TServerSocket unterstützt nicht automatisch die Bindung an eine bestimmte IP (obwohl dies mit manueller Arbeit durchgeführt werden kann), aber die TIdSocketHandle.IP-Eigenschaft wird für diesen Zweck verwendet, wobei eine leere Zeichenfolge mit INADDR_ANY übereinstimmt.

Im TIdCPServer.OnConnect, TIdCPServer.OnDisconnect und TIdCPServer.OnExecute Ereignisse, können Sie die TIdContext.Binding.IP und TIdContext.Binding.Port Eigenschaften verwenden, um zu unterscheiden, die den Aufruf Socket Bindung verbunden ist.

Dies wird häufig zur Unterstützung von SSL- und Nicht-SSL-Clients an verschiedenen Ports verwendet, z. B. für Protokolle wie POP3 und SMTP, die implizites und explizites SSL/TLS an verschiedenen Ports unterstützen. TIdHTTPServer unterstützt dies für die Unterstützung von HTTP und HTTPS URLs auf einem einzelnen Server (Sie können die TIdHTTPServer.OnQuerySSLPort verwenden, um anzupassen, welche Ports SSL/TLS nicht verwenden).

Zum Beispiel:

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

Awesome, nur fragt sich jeder Port einen eigenen Thread mit oder höchstwahrscheinlich alle drei im gleichen Kontext Thread? –

+1

Jeder Eintrag in der Sammlung "Bindungen" wird in einem eigenen Thread ausgeführt, der eingehende Verbindungen an seinem jeweiligen Port akzeptiert. Jede akzeptierte Clientverbindung läuft dann ebenfalls in einem eigenen Thread. Wenn Sie also 3 'Bindings'-Einträge und 3 verbundene Clients haben, werden 6 Threads ausgeführt. –

+0

Perfekt, genau das wollte ich. –

Verwandte Themen