Delphi - 桥接两个 TCP 端口
Delphi - Bridge two TCP ports
场景:
PC1:(IP:192.168.1.100)
Delphi 应用程序 运行 2 个侦听器在端口 5555 和端口 80
问题:
应用程序在端口 80 和 5555 之间设置双向通信 link。
PC2:(IP:192.168.1.200)
Delphi 应用程序 运行 侦听端口 8888 的 Web 服务。
问题:
应用程序在端口 5555 建立到 PC1 的连接,然后在本地端口 8888 和到 PC1 的连接之间建立双向通信 link。
PC2:网络服务 8888(听)- 没问题
PC2:套接字连接到 PC1 端口 5555 - 没问题
PC2:Web 服务和套接字连接之间的 TCP 桥(问题)
PC1:TidServer 5555(听)- 没问题
PC1:TidServer 80(听)- 没问题
PC1:5555 和 80 之间的 TCP 桥(问题)
我已经走到这一步了:
PC2:
WSocketLocal 本地连接到 8888 (ok)
WSocketExt 从外部连接到 PC1 端口 5555(正常)
procedure TWebServForm.WSocketExtDataAvailable(Sender: TObject; ErrCode: Word);
begin
WSocketLocal.SendStr(WSocketExt.ReceiveStr);
end;
procedure TWebServForm.WSocketLocalDataAvailable(Sender: TObject;
ErrCode: Word);
begin
WSocketExt.SendStr(WSocketLocal.ReceiveStr);
end;
PC1:
IdTCPServer1 侦听 5555(正常)
IdTCPServer2 侦听 80(正常)
以下两个程序有效,因此场景 PC1 已完成(有效)。
procedure TMain.ExtClientDataAvailable(Sender: TObject; Error: Word);
begin
if Error <> 0 then exit;
with Sender as TClient do
begin
Rcvd := Rcvd + ReceiveStr;
if (RemoteSocket.State = wsConnected) and (Rcvd <> '') then
begin
WSocketServerLocal.Client[0].SendStr(Rcvd);
Rcvd := '';
end;
end;
end;
procedure TMain.LocalClientDataAvailable(Sender: TObject; Error: Word);
begin
if Error <> 0 then exit;
with Sender as TClient do
begin
Rcvd := Rcvd + ReceiveStr;
if (RemoteSocket.State = wsConnected) and (Rcvd <> '') then
begin
WSocketServerExt.Client[0].SendStr(Rcvd);
Rcvd := '';
end;
end;
end;
我想要这样的结果:
在 PC1:在浏览器中,http://127.0.0.1:80 显示 PC2 端口 8888
的 Web 服务
我知道还有其他更简单的方法可以做到这一点,但我必须完全按照我描述的那样去做。
如何制作这两个 "bridges" 以及我应该使用哪些 Delphi 组件?
更新:我已经用两个服务器组件完成了 TCP 桥,现在我必须用两个连接组件做同样的操作。
更新:我解决了,这两个桥现在正在使用编写的代码...但是出现了新问题...当浏览器连接时,它可以同时建立多个连接到一个端口,我的代码一次只支持一个连接。我会调查的。
您不能 "bridge" 两个端口直接连接在一起,因为数据只是神奇地自动从一个端口传递到另一个端口。您需要位于客户端和服务器之间的代理代码来处理它。
在您的第一种情况下,PC1 上的代理可以创建两个侦听套接字,一个在端口 5555 上,一个在端口 80 上,然后从一个端口上连接的客户端套接字接收到的任何数据都可以传递给连接的客户端另一个端口上的套接字。
在您的第二种情况下,您在 PC1 上的代理可以在端口 80 上创建一个侦听套接字,然后在端口 5555 上创建一个单独的到 192.168.1.200 的出站套接字,然后在一个套接字上接收到的任何数据都可以传递到另一个插座。
您还没有解释您实际上是如何在 Delphi 应用程序中实现 socket/webserver 通信的。例如,如果您正在使用 Indy 组件,那么场景 2 可以使用 Indy 的 TIdMappedPortTCP
或 TIdHTTPProxyServer
组件来处理,这将为您完成大部分工作。但是场景 1,因为它涉及两个侦听器,所以您必须在自己的代码中手动 link 将它们组合在一起。
场景:
PC1:(IP:192.168.1.100) Delphi 应用程序 运行 2 个侦听器在端口 5555 和端口 80 问题: 应用程序在端口 80 和 5555 之间设置双向通信 link。
PC2:(IP:192.168.1.200) Delphi 应用程序 运行 侦听端口 8888 的 Web 服务。 问题: 应用程序在端口 5555 建立到 PC1 的连接,然后在本地端口 8888 和到 PC1 的连接之间建立双向通信 link。
PC2:网络服务 8888(听)- 没问题
PC2:套接字连接到 PC1 端口 5555 - 没问题
PC2:Web 服务和套接字连接之间的 TCP 桥(问题)
PC1:TidServer 5555(听)- 没问题
PC1:TidServer 80(听)- 没问题
PC1:5555 和 80 之间的 TCP 桥(问题)
我已经走到这一步了:
PC2:
WSocketLocal 本地连接到 8888 (ok)
WSocketExt 从外部连接到 PC1 端口 5555(正常)
procedure TWebServForm.WSocketExtDataAvailable(Sender: TObject; ErrCode: Word);
begin
WSocketLocal.SendStr(WSocketExt.ReceiveStr);
end;
procedure TWebServForm.WSocketLocalDataAvailable(Sender: TObject;
ErrCode: Word);
begin
WSocketExt.SendStr(WSocketLocal.ReceiveStr);
end;
PC1:
IdTCPServer1 侦听 5555(正常)
IdTCPServer2 侦听 80(正常)
以下两个程序有效,因此场景 PC1 已完成(有效)。
procedure TMain.ExtClientDataAvailable(Sender: TObject; Error: Word);
begin
if Error <> 0 then exit;
with Sender as TClient do
begin
Rcvd := Rcvd + ReceiveStr;
if (RemoteSocket.State = wsConnected) and (Rcvd <> '') then
begin
WSocketServerLocal.Client[0].SendStr(Rcvd);
Rcvd := '';
end;
end;
end;
procedure TMain.LocalClientDataAvailable(Sender: TObject; Error: Word);
begin
if Error <> 0 then exit;
with Sender as TClient do
begin
Rcvd := Rcvd + ReceiveStr;
if (RemoteSocket.State = wsConnected) and (Rcvd <> '') then
begin
WSocketServerExt.Client[0].SendStr(Rcvd);
Rcvd := '';
end;
end;
end;
我想要这样的结果: 在 PC1:在浏览器中,http://127.0.0.1:80 显示 PC2 端口 8888
的 Web 服务我知道还有其他更简单的方法可以做到这一点,但我必须完全按照我描述的那样去做。
如何制作这两个 "bridges" 以及我应该使用哪些 Delphi 组件?
更新:我已经用两个服务器组件完成了 TCP 桥,现在我必须用两个连接组件做同样的操作。
更新:我解决了,这两个桥现在正在使用编写的代码...但是出现了新问题...当浏览器连接时,它可以同时建立多个连接到一个端口,我的代码一次只支持一个连接。我会调查的。
您不能 "bridge" 两个端口直接连接在一起,因为数据只是神奇地自动从一个端口传递到另一个端口。您需要位于客户端和服务器之间的代理代码来处理它。
在您的第一种情况下,PC1 上的代理可以创建两个侦听套接字,一个在端口 5555 上,一个在端口 80 上,然后从一个端口上连接的客户端套接字接收到的任何数据都可以传递给连接的客户端另一个端口上的套接字。
在您的第二种情况下,您在 PC1 上的代理可以在端口 80 上创建一个侦听套接字,然后在端口 5555 上创建一个单独的到 192.168.1.200 的出站套接字,然后在一个套接字上接收到的任何数据都可以传递到另一个插座。
您还没有解释您实际上是如何在 Delphi 应用程序中实现 socket/webserver 通信的。例如,如果您正在使用 Indy 组件,那么场景 2 可以使用 Indy 的 TIdMappedPortTCP
或 TIdHTTPProxyServer
组件来处理,这将为您完成大部分工作。但是场景 1,因为它涉及两个侦听器,所以您必须在自己的代码中手动 link 将它们组合在一起。