Jer*_*dge 6 delphi indy indy10 delphi-xe2
我仍然习惯于Indy,它是一个具有强大功能的多线程套接字系统.我见过的一件大事是服务器套接字如何具有许多不同的绑定.例如,您可以在同一IP地址上为3个端口配置3个绑定.我在Delphi XE2上使用Indy 10.
我正在重建我的旧系统,它使用旧式TServerSocket和TClientSocket组件,ScktComps并与Indy TIdTCPServer和TIdTCPClient.旧系统实际上由每个端口上的3个完全不同的服务器/客户端套接字组成,每个套接字用于不同的目的,并且一起工作 - 类似于FTP如何使用一个套接字用于二进制数据而另一个套接字用于命令.
是否可以使用这些绑定模拟同一组件中的三个独立的服务器/客户端套接字?如果我只能声明一个绑定了3个端口的服务器套接字,并且在客户端上连接到服务器上的3个不同端口,那就太棒了.我想做的就是不再需要创建3个独立的服务器/客户端套接字组件并将它们组合成一个组件.
Rem*_*eau 14
是的,您可以使用单个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客户端,例如POP3和SMTP等协议,这些协议支持不同端口上的隐式和显式SSL/TLS. TIdHTTPServer这是为了在单个服务器上支持HTTP和HTTPSURL(您可以使用TIdHTTPServer.OnQuerySSLPort自定义哪些端口使用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;
Run Code Online (Sandbox Code Playgroud)