2016-04-15 21 views
1

场景:的Delphi - 桥两个TCP端口

PC1:(IP:192.168.1.100): 应用建立一个双向通信链路,在端口5555和端口80 问题运行2 listenener Delphi应用程序beteeen端口80和5555

PC2:(IP:192.168.1.200)在听端口8888 问题上运行的Web服务 Delphi应用程序: 应用使得在端口5555到PC1的连接,并且建立了一个两后本地端口8888和PC1连接之间的通信链路。

PC2:web服务8888(监听) - 不是一个问题
PC2:插座连接到PC1端口5555 - 不是一个问题
PC2:在web服务和所述插座连接(问题)之间的TCP桥

PC1 :TidServer 5555(听) - 这不是个问题
PC1:TidServer 80(听) - 这不是个问题
PC1:TCP大桥5555和80(问题)

之间我已经走到这一步:
PC 2:
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(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:在一个网页浏览器,http://127.0.0.1:80显示PC2口的Webservice的8888

我知道有其他和easyier方法可以做到这一点,但我必须要准确正如我所描述的那样。

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

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

更新:我解决了这个问题,这两个网桥现在正在使用书面代码......但是出现了一个新问题......当网页浏览器连接时,它可以同时建立多个连接到一个端口,我的代码一次只支持一个连接。我会调查这一点。

+2

看起来像学校作业... http://torry.net/quicksearchd.php?String=proxy&page=2 –

+0

不,它不是学校作业;)我已经看到代理,但是在这种情况下是不可suatable 。 - 关于这一点的特点是,PC2的桥是一个反向连接,也是一座桥。 –

+0

为您链接的代理是您可以从中学习到的源代码 –

回答

2

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

在第一种情况下,PC1上的代理可以创建两个侦听套接字,一个端口为5555,另一个为端口80,然后从一个端口上连接的客户端套接字接收的任何数据都可以传递到连接的客户端套接字在另一个港口。

在第二种情况下,PC1上的代理可以在端口80上创建侦听套接字,然后在端口5555上创建一个单独的出站套接字为192.168.1.200,然后在一个套接字上接收的任何数据都可以传递给其他插座。

你还没有解释你是如何在你的Delphi应用程序中实际实现你的socket/webserver通信的。例如,如果您使用的是​​组件,则可以使用Indy的TIdMappedPortTCPTIdHTTPProxyServer组件处理方案2,该组件将完成大部分工作。但情景1,因为它涉及两个听众,您将不得不手动将它们链接在您自己的代码中。

+0

谢谢你的回答。 - 等等,我必须编辑这篇文章。 –

+0

我来过这里,场景1:
两个TServerSockets(SS1,SS2)都在监听。
onSS1ClientRead:SS2.Socket.Connections [0] .SendText(SS1.Socket.ReceiveText);
onSS2ClientRead:SS1.Socket.Connections [0] .SendText(SS2.Socket.ReceiveText);

关于第二种情况,我可以看到你误解:)
这个PC连接到PC1是非常重要的(而不是其他方式),所以我试图做一些类似的情况1与一个听众和一个连接器。
但我无法弄清楚难题。我可以通过TIDMappedPortTCP解决方案1吗? –

+0

该信息应该已添加到您的问题中,未发布在评论中。无论如何,对于场景1,你有正确的想法(尽管你应该使用'ReceiveBuf()'和'SendBuf()')。不,你不能在场景1中使用'TIdMappedPortTCP',但你可以使用'TIdSimpleServer'或'TIdTCPServer'来代替。 –