是的,您可以一次使用一个TIdTCPServer
来管理多个端口。但是,在客户端,您仍然需要 3 个不同的客户端组件来连接到不同的端口。
在集合中创建 3 个条目TIdTCPServer.Bindings
,一个用于您要侦听的每个本地 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
和url(您可以使用 来自定义哪些端口使用 SSL/TLS 与不使用)。HTTPS
TIdHTTPServer.OnQuerySSLPort
例如:
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;