Aktualizováno 1.3. 2019

      
 

   Základy programování - TCP Socket ve Visual Basic
 
Základy programování počítačové komunikace pro radioamatérskou praxi s využitím TCP Socketu

 

V jedné z předchozích lekcí jsem ukázal, jak napsat jednoduchou aplikaci s TCP Serverem, který bude naslouchat na portu 32340 (lze změnit). Aplikace má dva obdélníčky, které lze pomocí povelů obarvit na zeleno (Zap1, Zap2) a pomocí jiných povelů (Vyp1, Vyp2) obarvit na červeno. Ovládací program, který to dovede byl na uvedené stránce přiložen.

Dnešní úloha zní: Napiš jednoduchý program pro Windows, který se připojí k TCP serveru a pošle na naslouchající server uvedené 4 povely. Program je ke stažení (asi 23 kB exe) zde a zdrojový kód zde.

 

Řešení

Jak jsem dříve napsal, moje oko v Toolboxu Visual Basic nevidělo komponentu podobnou TCP Socketu. Takže očekávám psaní kódu a nějaký ten oser. Až tak hrozné to nebylo. Kreslil a psal jsem ve Visual Basic Express 2018. Uživatelské rozhraní vidíte na spuštěné aplikaci. IP adresa se před povelováním zadá do TextBox1. Port je nastaven přiřazením konstanty natvrdo (použito port = 32340). Celý kod vypadá takto:

Imports System.Net.Sockets

Public
Class Form1
   
Dim port As Integer = 32340 'deklarace promenne port a natvrdo yadana hodnota
   
Dim server As String 'deklarace promenne server, tedy hodnota IP adresy
   
Dim povel As [Byte]()

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    povel = System.Text.Encoding.ASCII.GetBytes(
"Zap1")                                                        'priradi se hodnota promenne povel
    TCP_klient_makej()                                                                                                           
'zavolani procedury (metody) TCP_klient_makej()

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    povel = System.Text.Encoding.ASCII.GetBytes(
"Vyp1")                                                       'priradi se hodnota promenne povel
    TCP_klient_makej()                                                                                                          
'zavolani procedury (metody) TCP_klient_makej()
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    povel = System.Text.Encoding.ASCII.GetBytes(
"Zap2")                                                       'priradi se hodnota promenne povel
    TCP_klient_makej()                                                                                                          
'zavolani procedury (metody) TCP_klient_makej()
End Sub

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    povel = System.Text.Encoding.ASCII.GetBytes(
"Vyp2")                                                       'priradi se hodnota promenne povel
    TCP_klient_makej()                                                                                                          
'zavolani procedury (metody) TCP_klient_makej()
End Sub

Private Sub TCP_klient_makej()
    server = TextBox1.Text                                                                                                     
'priradi se hodnota promenne server z TextBox1
   
Dim client As New TcpClient(server, port)                                                                            'deklaruje a otevýe nov‚ho TCP klienta
   
Dim stream As NetworkStream = client.GetStream()                                                            'deklaruje nově stream a napojˇ klienta
    stream.Write(povel, 0, povel.Length)                                                                                   
'zapise byty streamu; pocet bytu je precten z povel.Length
    client.Close()                                                                                                                    
'zavre TCP klienta
End Sub

End Class


 

Poznámka:

Náš nový prográmek je náhradou za ten, který jsme si dříve napsali v Gambas 3 pro Linux. Program vypadal takto - viz vpravo, tlačítka mají obdobný význam.

Původním prográmkem jsme mohli ovládat z Linuxu, novým to jde i z Windows.

 


Klient spuštěný pod Windows (funguje to, ale pozor, musíte zadat správně IP adresu do TextBox1, při neexistující se to podělá)

Domácí úkol

Výše (nad obrázkem) jsem uvedl, že se program podělá, protože není ošetřena tzv. výjimka. Pokuste se výjimku ošetřit.

Poznámky:

1. Jak rád mnohokrát uvádím, programování je společenská věda. Je důležité zjistit, jak to programátoři, kteří píší metody, mysleli. Naučili jsme se porozumět velice zajímavé metodě:
povel = System.Text.Encoding.ASCII.GetBytes(
"Zap1"), která nám udělá pole bajtů z proměnné typu řetěz (konkrétně "Zap1", "Zap2", "Vyp1", "Vyp2"). To se nám bude hodit.
2. Metoda
stream.Write(povel, 0, povel.Length), je také zajímavá, zapíše nám bajty z proměnné povel do tzv. streamu.
3. Konečně je zajímavý i způsob streamování, konkrétně, jak se stream dostává do TCP Socketu.
4. No, zvládli jsme to i bez komponenty TCP Socket v Toolboxu, zvládli jsme to v ještě přehledném Visual Basic Express 2008 a byla to "makačka na bednu", protože jsem musel googlovat na webu Microsoft - zde.

Závěry

1. Z pedagogického hlediska jsem se snažil ukázat, jak vypadá programování jednoduchých úloh neprogramátorem (vulgárně "vidlácky"). Každé prostředí je jiné. Dodnes nejsem schopen říci, které by mi bylo nejbližší. Visual Basic 2008 jsem používal dříve a občas ho používám dodnes. Před tím jsem používal Visual Basic od verze 1 (Windows 3.11). Tvrdím, že jde o dobrý produkt, který nás někdy velice mile překvapí, proto jsem zde uvedl více jednoduchých ukázek. Také tvrdím, že někdy se nevyhnete téměř detektivní činnosti. Když jsem uvažoval, co popsat, vzpomněl jsem si na import třídy a syntaxi metod. Tedy věci, kdy jsem musel googlit. Velmi rychle jsem si zvykl na Gambas. Koupil jsem tištěnou knihu, stáhnul příručku a kupodivu mi šla práce rychle od ruky. Kdo nepotřebuje Windows nebo macOS, pak Gambas je rychlou, snadno pochopitelnou cestou k cíli. Vřele doporučuji. V prostředí XOJO najdeme dobře vybavené Toolboxy pro rychlé řešení téměř všech potřebných situací. XOJO má dobrou dokumentaci, snadno se učíme novým věcem. Od dříve zmíněných prostředí je přeci jenom trochu jiné. Odměnou budiž možnost vytvořit jednoduše z jednoho zdrojového kódu aplikace pro více platforem. 

2. Z praktického hlediska jsem se snažil o určitou objektivitu. I když mě Microsoft občas neskutečně dopálí a na konci roku 2017 mě donutil k opuštění Windows 10 na PC, které jsem používal u radioamatérské stanice, chci být objektivní. Pro zkoušky jsem pořídil dvě licence Win10Pro a nainstaloval je na noteboocích Dell Vostro 3350 a na HP ProBook 4340. Oba stroje jsem vybavil RAM 8 GB a plotnovými HDD Western Digital. V obou případech je organizace na disku MBR a zavaděč Grub2. Od okamžiku, kdy stisknu volbu operačního systému (na obou strojích jsou 3 až 4), tak Windows 10 naběhnou asi za 20 sekund do obrazovky s PIN. Pracují stabilně a kromě zbytečných programů a služeb jim toho až tak nevytýkám na funkcionalitě. Na obou strojích mám instalováno více vývojových prostředí, ve kterých píšu programy. Problémy vidím jinde. Konkrétně velký upgrade operačního systému. Prý ho plánuje Microsoft po 18 měsících. To, co jsem zažil minule - děkuji, nechci. Naopak, čistá instalace mě překvapila. Trvala necelou hodinu a to považuji za přijatelné. Možná bude lepší zahodit starý build. Ten nový si vyzkoušet na jiném disku a pokud bude OK, tak nainstalovat. Zatím u Windows stále platí ta "největší svoboda", za kterou považuji okopírování a spuštění jednoduchého exáče (exe souboru). I když s výrobci antiviráků o ni asi brzo přijdeme. Např. F-Secure se zachoval jako obyčejný RAMLWARE. Vlastní exáč (tento příklad), který jsem si zkompiloval jen s použitím prostředků MS, uložil na vlastní server a z něho stáhnul, tak označil jako nebezpečný malware (ten zkompilovaný na disku mu nevadil). Pokud profesionální firmy budou své SAJRAJTWARY vydávat za profesionální programy s "profesionální" heuristickou analýzou, kterou ve skutečnosti neumí (kolik virů si už uživatelé stáhli z repozitářů), pak o tuto svobodu rychle přijdeme. Bohužel. Ale dokud ji máme, tak mne ještě neopustila síla napsat a nakreslit si pár užitečných a jednoduchých prográmků. Proto články o tom, jak to dělám a proč to dělám. Malá ukázka o činnosti sajrajtwaru nakonec:

Dále nemá smysl komentovat. Byznys je byznys
 

 

Zpět na obsah


TU 73, Mira, ok1ufc