Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Сделать загрузчик приложения через TCP

Delphi , Интернет и Сети , TCP/IP

Сделать загрузчик приложения через TCP

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
Loading Delphi apps without a browser and on Win as Linux as well needs a 
decision once. 
With a loader on the client side, no further installation is in charge. 
We had the requirement starting different Delphi apps from a 
linux or windows server, wherever you are. 
We call it Delphi Web Start (DWS). 
The dws-client gets a list and after clicking on it, the app is 
loading from server to client with just a stream. 
First we had to choose between a ftp and a tcp solution. The 
advantage of tcp is the freedom to define a separate port, which 
was "services, port 9010 - DelphiWebStart". 
You will need indy. Because it is simple to use and very fast. 
The tcp-server comes from indy which has one great advantage: 


CommandHandlers is a collection of text commands that will be 
processed by the server. This property greatly simplify the 
process of building servers based on text protocols. 


First we start with DWS_Server, 
so we define two command handlers: 
}

 CTR_LIST = 'return_list';
 CTR_FILE = 'return_file';

 { 
By starting the tcp-server it returns with the first command 
handler "CTR_LIST" a list of the apps: 
}

 procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
 ...
 // comes with writeline from client 
if sRequest = CTR_LIST then begin
   for idx:= 0 to meData.Lines.Count - 1 do
   athread.Connection.WriteLn(ExtractFileName(meData.Lines[idx]));
   aThread.Connection.WriteLn('::END::');
   aThread.Connection.Disconnect;


 { 
One word concerning the thread: 
In the internal architecture there are 2 threads categories. 

First is a listener thread that "listen" and waits for a 
connection. So we don't have to worry about threads, the built in 
thread will be served by indy though parameter: 
}

 IdTCPServer1Execute(AThread: TIdPeerThread)

 { 
When our dws-client is connected, this thread transfer all the 
communication operations to another thread. 
This technique is very efficient because your client application 
will be able to connect any time, even if there are many 
different connections to the server. 
}


 //The second command "CTR_FILE" transfers the app to the client: 
if Pos(CTR_FILE, sRequest) > 0 then begin
     iPos := Pos(CTR_FILE, sRequest);
     FileName := GetFullPath(FileName);
     if FileExists(FileName) then begin
       lbStatus.Items.Insert(0, Format('%-20s %s',
         [DateTimeToStr(now), 'Transfer starts ...']));
      FileStream := TFileStream.Create(FileName, fmOpenRead +
      fmShareDenyNone);
      aThread.Connection.OpenWriteBuffer;
      aThread.Connection.WriteStream(FileStream);
      aThread.Connection.CloseWriteBuffer;
      FreeAndNil(FileStream);
      aThread.Connection.Disconnect;


 { 
Now let's have a look at the client side. The client connects to 
the server, using the connect method of TIdTcpClient. In this 
moment, the client sends any command to the server, in our case 
(you remember DelphiWebStart) he gets the list of available apps: 
}

     with IdTCPClient1 do begin
       if Connected then DisConnect;
       showStatus;
       Host:= edHost.Text;
       Port:= StrToInt(edPort.Text);
       Connect;
       WriteLn(CTR_LIST);

 //After clicking on his choice, the app will be served: 

with IdTCPClient1 do begin
 ExtractFileName(lbres.Items[lbres.ItemIndex])]));
 WriteLn(CTR_FILE + lbres.Items[lbres.ItemIndex]);
 FileName:= ExpandFileName(edPath.Text + '/' +
 ExtractFileName(lbres.Items[lbres.ItemIndex]));
 ...
 FileStream := TFileStream.Create(FileName, fmCreate);
    while connected do begin
      ReadStream(FileStream, -1, true);
   ....
     {$IFDEF LINUX}
         execv(pchar(filename),NIL);
       //libc.system(pchar(filename)); 
     {$ENDIF}
      {$IFDEF MSWINDOWS}
      // shellapi.WinExec('c:\testcua.bat', SW_SHOW); 
     with lbstatus.items do begin
        case  shellapi.shellExecute(0,'open', pchar(filename), '',NIL,
                     SW_SHOWNORMAL) of
          0: insert(0, 'out of memory or resources');
          ERROR_BAD_FORMAT: insert(0, 'file is invalid in image');
          ERROR_FILE_NOT_FOUND: insert(0,'file was not found');
          ERROR_PATH_NOT_FOUND: insert(0,'path was not found');
        end;
        Insert(0, Format('%-20s %s',
                [DateTimeToStr(now), filename + ' Loaded...']));
      end
      {$ENDIF}

 { 
One note about execution on linux with libc-commands; there will 
be better solutions (execute and wait and so on) and we still 

work on it, so I'm curious about comments on 

   "Delphi Web Start" 

therfore my aim is to publish improvments in a basic framework on 
sourceforge.net depends on your feedback ;) 

Many thanks to Dr. Karlheinz Morth with a first glance. 

Test your server with the telnet program. Type telnet 
hostname:9010 and then: 'return_list' and you'll get the list 
from the apps you defined in a txt-file on the server. 
}

 meData.Lines.LoadFromFile(ExpandFileName(FILE_PATH));

 { 
I know that we haven't implement an error handling procedure, 
but for our scope this example is almost 
sufficient. 
Code is available: http://max.kleiner.com/download/dws.zip 
}

Рецензия кода:

Серверная сторона (DWS_Server)

Сервер использует компоненты Indy для создания сервера TCP, который слушает входящие соединения на порту 9010. Сервер отвечает на два типа запросов: CTR_LIST и CTR_FILE.

  1. Когда клиент отправляет запрос на CTR_LIST, сервер возвращает список доступных приложений, перебирая строки в текстовом файле (meData.Lines) и отправляя каждую строку как отдельный ответ.
  2. Когда клиент отправляет запрос на CTR_FILE, сервер передает запрошенное приложение клиенту. Клиент отвечает за запись файла на диск.

Сервер использует компонент Indy IdTCPServer для обслуживания нескольких клиентов одновременно. Каждое входящее соединение обрабатывается отдельным потоком, что упрощает процесс создания серверов на основе текстовых протоколов.

Клиентская сторона (DWS_Client)

Клиент подключается к серверу с помощью компонента Indy IdTCPClient и отправляет запросы для получения списка приложений или загрузки приложения. Клиент использует те же два команды, что и сервер: CTR_LIST и CTR_FILE.

  1. Когда клиент получает список приложений, он отображает список в комбобоксе (lbres).
  2. Когда пользователь выбирает приложение из списка и нажимает на него, клиент отправляет запрос серверу для загрузки выбранного приложения.

Клиент использует компонент Indy TIdTCPClient для установления соединения с сервером и отправки запросов. Он также использует компонент Indy TStream для чтения и записи файлов.

Замечания

  • Код не реализует обработку ошибок, что может привести к проблемам в производственной среде.
  • Код предполагает, что клиент имеет доступ к директории, где он хочет сохранить загруженное приложение.
  • Код использует TFileStream для передачи файлов между сервером и клиентом. Это может быть медленным для больших файлов.
  • Код использует execv() на Linux для запуска загруженного приложения, что не является рекомендованным подходом. Лучше использовать системный вызов fork() или библиотеку libproc.
  • Код использует shellapi.ShellExecute() на Windows для открытия загруженного приложения, что может не работать в всех сценариях.

В целом, этот код предоставляет основу для создания приложения-лайдера Delphi с использованием TCP. Однако он требует дальнейшего развития и тестирования для обеспечения стабильности и безопасности.

Создание загрузчика приложений через протокол TCP для запуска Delphi-приложений на клиентских компьютерах под Windows и Linux без использования веб-браузера.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TCP/IP ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-28 06:44:48/0.0037381649017334/0