是的,您可以使用一個TIdTCPServer
一次管理多個端口。但是,在客戶端,您仍然需要3個不同的客戶端組件連接到不同的端口。
在TIdTCPServer.Bindings
集合中創建3個條目,其中一個用於您要收聽的每個本地IP /端口,其中TIdSocketHandle.Port
屬性將等於TServerSocket.Port
屬性。 TServerSocket
本身不支持綁定到特定IP(儘管可以通過一些手動工作完成),但TIdSocketHandle.IP
屬性用於此目的,其中空白字符串等同於INADDR_ANY
。
在TIdCPServer.OnConnect
,TIdCPServer.OnDisconnect
和TIdCPServer.OnExecute
事件,您可以使用TIdContext.Binding.IP
和TIdContext.Binding.Port
性質來區分其結合呼叫套接字連接。
這樣做的一個常見用途是在不同端口上支持SSL和非SSL客戶端,例如支持不同端口上支持隱式和顯式SSL/TLS的協議,如POP3和SMTP。 TIdHTTPServer
是否支持單個服務器上的HTTP
和HTTPS
網址(您可以使用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;
真棒,只是使用它自己的線程或最有可能所有3個在同一背景下的線程每個端口疑惑? –
「綁定」集合中的每個條目都在其自己的線程中運行,以接受其各自端口上的入站連接。每個接受的客戶端連接也在其自己的線程中運行。所以如果你有3個'Bindings'條目和3個連接的客戶端,那就是6個線程在運行。 –
完美,這正是我想要的。 –