Вводные
В предыдущем посте мы уже научились через клиентский браузер запускать EXE приложение на серверной машине.
В данном посте создадим свое клиентское EXE приложение. Будем отправлять POST запрос на серверную машину с командой запустить EXE приложение, например блокнот на серверной машине.
Будем делать это через idHTTPServer сервер, который разместим на серверной стороне. И idHTTP, который разместим на клиентской стороне.
Итак, создадим StandAlone UniGUI приложение и в серверный модуль добавим idHTTPServer и настроим его на 82 порт, с 80 портом получается couldn’t bind sockets. Думаю, если поработать ещё, можно и на 80 порт настроить, но сейчас задача не в этом.
В серверной части настроим прием и обработку POST параметров следующим образом
1 2 3 4 5 6 7 8 9 10 11 |
procedure TUniServerModule.IdHTTPServerCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); begin if ARequestInfo.Params.Values['MyComand']='StartNotePad' then begin shellAPI.ShellExecute(0, 'open', PWideChar('c:\Windows\System32\notepad.exe'), nil, nil, SW_SHOWNORMAL); end; |
Теперь создадим произвольный EXE клиент, добавим idHTTP
Кнопку Test обработаем следующим образом
1 2 3 4 5 6 7 8 9 10 11 |
procedure TMainForm.bSendClick(Sender: TObject); var Params:TStringList; HtmlResult:string; begin Params:=TStringList.Create; Params.Add('MyComand=DoSomethingNow'); HtmlResult:=IdHTTP.Post('http://localhost:82/',Params); FreeAndNil(Params); end; |
Что вообще происходит?
На 127.0.0.1 или localhost на 82 порт отправляем POST сообщение. А кто принимает? Да наш idHTTPServer, в результате происходит обработка сообщения в событии idHTTPServerComandGet и запускается наш блокнот.
Попробуем по взрослому?
Загрузим серверную часть на сервер в сети. У меня Azure. При этом надо будет поменять при отправке localhost на адрес нашего сервера в сети. На Azure также надо открыть порты, так называемые endpoints, в нашем случае, 82 порт.
По моему, мы добились чего хотели – таким образом, можно из своего клиентского EXE приложения, написанного на DELPHI запускать любые приложения на удаленной машине.
Выводы
В данном случае я прикрутил idHTTPServer к UniGUI серверу, но это необязательно. Можно на серверную машину поместить обычный EXE, написанный на Delphi, поместить в него idHTTP сервер, и это будет работать точно также.
Словом, я в этом вопросе чуток разобрался, тут конечно, много чего ещё предстоит освоить, но начало положено. Моя задача была – научиться удаленно запускать EXE файлы из клиента на DELPHI на удаленной машине.