2016-04-15 4 views
1

Сценарий:Delphi - Мост два порта TCP

ПК1: (IP: 192.168.1.100) Delphi приложение, работающее 2 listenener в порту 5555 и в порту 80 Проблема: Применение установить ссылку как двусторонняя связь beteeen порт 80 и 5555.

PC2: (IP: 192.168.1.200) Delphi приложение работает веб-сервиса прослушивания в порту 8888. Проблема: Применение делает подключение к PC1 на порту 5555 и после этого устанавливает как -средняя линия связи между локальным портом 8888 и соединением с ПК1.

PC2: Webservice 8888 (Listen) - Не проблема
PC2: Разъем подключения к ПК1 порту 5555 - не проблема
PC2: TCP мост между Webservice и гнездом Connect (проблема)

PC1 : TidServer 5555 (Listen) - Не проблема
PC1: TidServer 80 (Listen) - Не проблема
PC1: TCP мост между 5555 и 80 (задача)

Я пришел далеко:
PC 2:
WSocketLocal Connect местного до 8888 (ок)
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 (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; 

Я хочу, чтобы этот результат: На ПК1: В WebBrowser, http://127.0.0.1:80 показывает WebService из PC2 порта 8888

Я знаю, что есть и другие, и easyier способов сделать это, но я должен быть точно как я описал.

Как я могу сделать два «моста» и какие компоненты Delphi использовать?

Обновление: я выполнил мост TCP с двумя компонентами сервера, теперь мне нужно выполнить ту же операцию с двумя компонентами Connect.

Обновление: я решил, что два моста теперь работают с написанным кодом ... Но возникла новая проблема ... Когда веб-браузер подключается, он может одновременно создавать несколько подключений к порту, мой код поддерживает только одно соединение за раз. Я исследую это.

+2

выглядит как домашнее задание в школе ... http://torry.net/quicksearchd.php?String=proxy&page=2 –

+0

Нет, это не домашнее задание в школе;) Я видел на прокси, но в этой ситуации не подходит , - Спецификация об этом заключается в том, что мост на PC2 является обратным соединением, а также мостом. –

+0

, который связал прокси для вас, является исходным кодом, который вы можете узнать из –

ответ

2

Вы не можете «соединить» два порта вместе, где данные просто волшебным образом передаются от одного порта к другому автоматически. Для этого вам нужен прокси-код, находящийся между клиентом и сервером.

В вашем первом сценарии ваш прокси-сервер на ПК1 может создать два прослушивающих сокета: один на порту 5555 и один на порт 80, а затем любые данные, полученные от подключенного клиентского сокета на одном порту, могут быть переданы подключенному клиентскому сокету на другом порту.

В вашем втором сценарии ваш прокси-сервер на ПК1 может создать прослушивающий сокет на порту 80, а затем создать отдельный исходящий сокет до 192.168.1.200 на порту 5555, а затем любые данные, полученные на одном сокете, могут быть переданы на другой гнездо.

Вы не объяснили, как вы на самом деле осуществляете связь сокетов/веб-серверов в своих приложениях Delphi. Например, если вы используете компоненты Indy, то сценарий 2 можно обрабатывать с помощью компонента Indy TIdMappedPortTCP или TIdHTTPProxyServer, который будет выполнять основную часть работы за вас. Но сценарий 1, потому что он включает в себя двух слушателей, вам придется вручную связать их вместе в своем собственном коде.

+0

Благодарим вас за ответ. - Держись, я должен отредактировать этот пост. –

+0

Я зашел так далеко, Scenario1:
Два TServerSockets (SS1, SS2) Оба прослушивания.
onSS1ClientRead: SS2.Socket.Connections [0] .SendText (SS1.Socket.ReceiveText);
onSS2ClientRead: SS1.Socket.Connections [0] .SendText (SS2.Socket.ReceiveText);

О 2 сценариях, я вижу, что вы неправильно поняли :)
Очень важно, чтобы ЭТО ПК подключался к PC1 (не наоборот), поэтому я пытаюсь сделать что-то подобное, как сценарий 1 с одним слушателем и один разъем.
Но я не могу понять головоломку. Могу ли я решить сценарий 1 с TIDMappedPortTCP –

+0

Эта информация должна быть добавлена ​​к вашему вопросу, а не в комментариях. В любом случае для сценария 1 у вас есть правильная идея (хотя вместо этого вы должны использовать 'ReceiveBuf()' и 'SendBuf()'). И нет, вы не можете использовать 'TIdMappedPortTCP' для сценария 1, но вместо этого вы можете использовать' TIdSimpleServer' или 'TIdTCPServer'. –

 Смежные вопросы

  • Нет связанных вопросов^_^