gpt4 book ai didi

Delphi - 桥接两个 TCP 端口

转载 作者:行者123 更新时间:2023-12-01 17:43:18 27 4
gpt4 key购买 nike

场景:

PC1:(IP:192.168.1.100)Delphi 应用程序在端口 5555 和端口 80 运行 2 个监听器问题:应用程序在端口 80 和 5555 之间建立了双向通信链路。

PC2:(IP:192.168.1.200)Delphi 应用程序运行一个 Web 服务,监听端口 8888。问题:应用程序在端口 5555 处与 PC1 建立连接,然后在本地端口 8888 和与 PC1 的连接之间建立双向通信链路。

PC2:Web 服务 8888(监听)- 没问题
PC2:套接字连接到 PC1 端口 5555 - 没问题
PC2:Web 服务和套接字连接之间的 TCP 桥(问题)

PC1:TidServer 5555(监听)- 没问题
PC1:TidServer 80(监听)- 没问题
PC1:5555 和 80 之间的 TCP 桥(问题)

我已经走到这一步了:
PC2:
WSocketLocal 连接本地到 8888(ok)
WSocketExt 连接外部到 PC1 端口 5555 (ok)

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 (ok)
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服务

我知道还有其他更简单的方法可以做到这一点,但我必须完全按照我所描述的那样。

如何制作这两个“桥梁”以及应该使用哪些 Delphi 组件?

更新:我已经使用两个服务器组件完成了 TCP 桥接,现在我必须使用两个连接组件执行相同的操作。

更新:我解决了,两个网桥现在正在使用编写的代码...但是出现了一个新问题...当网络浏览器连接时,它可以同时向一个端口建立多个连接,我的代码一次仅支持一个连接。我会调查此事。

最佳答案

您无法直接将两个端口“桥接”在一起,数据只是神奇地自动从一个端口传递到另一个端口。您需要位于客户端和服务器之间的代理代码来处理该问题。

在第一个场景中,PC1 上的代理可以创建两个监听套接字,一个在端口 5555 上,一个在端口 80 上,然后从一个端口上的已连接客户端套接字接收到的任何数据都可以传递到另一个端口。

在第二种情况下,PC1 上的代理可以在端口 80 上创建监听套接字,然后在端口 5555 处创建到 192.168.1.200 的单独出站套接字,然后一个套接字上接收到的任何数据都可以传递到另一个套接字套接字。

您还没有解释如何在 Delphi 应用程序中实际实现套接字/网络服务器通信。如果您使用Indy例如,场景 2 可以使用 Indy 的 TIdMappedPortTCPTIdHTTPProxyServer 组件来处理,这将为您完成大部分工作。但场景 1,因为它涉及两个监听器,所以您必须在自己的代码中手动将它们链接在一起。

关于Delphi - 桥接两个 TCP 端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36647425/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com