情景:
PC1 :( IP:192.168.1.100) Delphi应用程序在端口5555和端口80上运行2个侦听器 问题: 应用程序设置了一个双向通信链路,即80和5555端口。
PC2 :( IP:192.168.1.200) 运行web服务的Delphi应用程序在端口8888上进行侦听。 问题: 应用程序在端口5555与PC1建立连接,然后在本地端口8888和与PC1的连接之间建立双向通信链路。
PC2:Webservice 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(确定)
IdTCPServer2听80(ok)
以下两个程序有效,因此情景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:在web浏览器中,http://127.0.0.1:80显示PC2端口8888的Web服务
我知道有其他更简单的方法可以做到这一点,但我必须完全按照我的描述。
如何制作两个“桥梁”以及我应该使用哪些Delphi组件?
更新:我已经使用两个服务器组件完成了TCP Bridge,现在我必须使用两个Connect组件执行相同的操作。
更新:我解决了,两个桥现在正在处理编写的代码......但是出现了一个新的问题...当一个webbrowser连接时,它可以同时与一个端口建立多个连接,我的代码一次只支持一个连接。我会调查一下。
答案 0 :(得分:2)
你不能直接将两个端口“桥接”在一起,数据只是神奇地从一个端口自动传递到另一个端口。您需要位于客户端和服务器之间的代理代码来处理它。
在您的第一个场景中,PC1上的代理可以创建两个侦听套接字,一个在端口5555上,另一个在端口80上,然后从一个端口上连接的客户端套接字接收的任何数据都可以传递到连接的客户端套接字上另一个港口。
在第二种情况下,PC1上的代理可以在端口80上创建一个侦听套接字,然后在端口5555创建一个单独的出站套接字到192.168.1.200,然后在一个套接字上接收的任何数据都可以传递给另一个插座。
您还没有解释如何在Delphi应用程序中实际实现套接字/网络服务器通信。例如,如果您使用Indy组件,则可以使用Indy的TIdMappedPortTCP
或TIdHTTPProxyServer
组件处理方案2,这将为您完成大部分工作。但是方案1,因为它涉及两个侦听器,您必须在自己的代码中手动将它们链接在一起。