Domů

Komunikace dvou programů po síti

První článek týkající se Delphi bych chtěl věnovat komunikaci dvou programů po síti. Nejedná se o nijak složitou věc, která se ale dá využít třeba k manipulaci s kamarádovým počítačem... :-)


 K tomu, aby mohl celý program fungovat budeme potřebovat dvě aplikace. Tyto aplikace se nazývají Klient a Server.
 Ke komunikaci použijeme komponenty ClientSocket a ServerSocket. Ty jsou i v nejzákladnější instalaci Delphi 6 Personal. Ovšem pod Delphi 7 byste je nejspíše hledali marně. Přesto tam jsou. V nabídce Component vyberte Install Packages. Objeví se seznam nainstalovaných balíčků komponent. Najděte Borland Socket Components a zaškrtněte. Potvrďte OK.

 Jak už jsem řekl, bude potřeba vytvořit dva spolu komunikující programy. Nejprve si naprogramujeme aplikaci Client, která bude na počítači odkud bude druhý počítač po síti nebo internetu ovládán.

 Na formulář vložte komponentu ClientSocket ze záložky Internet. Ve vlastnostech nové komponenty jsou nejdůležitější hodnoty u Address a Port. Address určuje síťovou nebo internetovou adresu, kam bude klient odesílat příkazy a Port určuje komunikační port. Dáme třeba 1357. Vlastnost Active poté určuje, zdali bude připojení aktivní hned po spuštění programu. Tuto vlastnost doporučuji nastavit na False. Poslední velmi důležitou vlastností je ClientType. Nastavte na ctNonBlocking.
 Dále vložte na formulář editační políčko, kam budeme psát adresu počítače, tři tlačítka, ComboBox pro seznam příkazů a také Memo, kam se budou zapisovat informace o připojení, atd.

form1


 Teď obsloužíme událost při stisku tlačítka Připojit.
procedure TForm1.btnPripojitClick(Sender: TObject);
begin
  Memo1.Lines.Append('Připojuji se...');
  ClientSocket1.Address := Edit1.Text; // Nastavení adresy
  Try
    ClientSocket1.Open; // Připojit...
  Finally
    Memo1.Lines.Append('Připojeno k ' + Edit1.Text);
    btnPripojit.Enabled := False;
    btnOdpojit.Enabled := True;
    btnOdeslat.Enabled := True;
  End;
end;


 Odpojení bude podobné.
procedure TForm1.btnOdpojitClick(Sender: TObject);
begin
  Memo1.Lines.Append('Připojuji se...');
  Try
    ClientSocket1.Close; // Odpojit...
  Finally
    Memo1.Lines.Append('Odpojeno.');
    btnPripojit.Enabled := True;
    btnOdpojit.Enabled := False;
    btnOdeslat.Enabled := False;
  End;
end;


 Nakonec musíme naprogramovat samotné odeslání příkazu. Na ukázku si naprogramujeme podporu pro tři příkazy. Zobraz_dialog zobrazí na cizím počítači dialog s nějakým textem, udelej_zvuk jednoduše pípne z PC Speakeru (takový ten reproduktor vestavěný v každém počítači, co vydává ty pípavé zvuky, jako dřív na starších počítačích u her atd.) a poznamkovy_blok spustí na cizím počítači poznámkový blok. Tyto příkazy přidáme do Items v ComboBoxu. Uživatel si bude poté moci jeden z nich zvolit a odeslat ho.

 Teď obsloužíme tlačítko Odeslat.
procedure TForm1.btnOdeslatClick(Sender: TObject);
begin
  Memo1.Lines.Append(ComboBox1.Text);
  ClientSocket1.Socket.SendText(ComboBox1.Text);
end;


 Tímto máme klienta prakticky hotového. Ale co když budeme chtít vědět, jestli server text skutečně přijal? Můžeme to udělat tak, že server okamžitě po přijetí textu odešle onen text zpátky a aby bylo poznat, že se jedná o jakési echo, přidá před něj "Re:". Tento text pak znovu zapíšeme do Mema.

 U ClientSocket se k tomuto hodí událost OnRead.
procedure TForm1.ClientSocket1OnRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  Memo1.Append(Socket.ReceiveText);
end;


 Aplikace klienta je tedy kompletní. Projekt uložte a pojmenujte jej jako Klient.


 Teď si vytvořte nový projekt a na formulář vložte komponentu ServerSocket. Poté u ní nastavte Port - ten musí být stejný jako u klienta (1357), Active nastavte na True a ServerType na stNonBlocking.

 Poslední co musíme udělat je obsloužit událost OnClientRead.
procedure TForm1.ServerSocket1OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
Var S: String;
begin
  S := Socket.ReceiveText;
  Socket.SendText('Re:' + S); // Odeslání echa
  If S = 'zobraz_dialog' then ShowMessage('Zformátovat disk?');
  If S = 'udelej_zvuk' then Windows.Beep(1000, 500);
  If S = 'poznamkovy_blok' then WinExec('notepad', SW_NORMAL);
end;


 No a to je vlastně všechno. Samozřejmě nejsou ani v jedné z aplikací ošetřeny chyby, které mohou vzniknout například použitím špatné adresy. Kdyby si s nimi někdo nevěděl rady, ať napíše.
 Co se týče serveru na kamarádově počítači, určitě by bylo vhodné tuto aplikaci nějak skrýt, aby nebyla jen tak vidět. Možností je několik, já zde uvedu jen tu opravdu nejuniverzálnější. Aplikace bude sice vidět v seznamu procesů, ale nikde jinde. Jednoduše klikněte v nabídce Project na View Source. Zobrazí se samotný kód programu. Pak jednoduše přidejte hned za Begin

Application.ShowMainForm := False;

Aplikace už nebude vidět.

Upozorňuji, že vytvořený klient vůbec nepočítá s tím, že by se stala nějaká chyba. Ochytávání chyb, úspěšného připojení a podobně je opraveno v posledním z přiložených souborů.
Aplikaci serveru i klienta si můžete stáhnout zde:

    S EXE soubory (430,8 kB)
    Bez EXE souborů (12,8 kB)
    Klientská část s odchytáváním chyb (7,9 kB)