Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[TuT] TCP w AutoIT. Część 2 - Wysyłanie danych


Rekomendowane odpowiedzi

Opublikowano

Witam w drugiej części tutoriala. Opiszę dzisiaj jak wygląda wysyłanie danych przez TCP w AutoIcie.

Polecam przeczytać pierwszą część tutoriala, jeśli jeszcze tego nie zrobiłeś.

 

No dobrze, w poprzedniej części wyjaśniłem ogółem co to TCP i jak stworzyć swój serwer i się z nim połączyć. Dzisiaj zrobimy przesyłanie danych między serwerem a klientem. Będę korzystał z kodu, który stworzyłem w poprzedniej części jako szablonu.

 

;############ NASZ KLIENT ############
TCPStartup()

Global $serwer = TCPConnect(@IPAddress1, 1337) ;próba połączenia z serwerem

If @ Then
	MsgBox(16, "Błąd!", "Nie udało się połączyć z serwerem - kod błędu: "&@)
	TCPShutdown() ;wyłączamy TCP
	Exit
EndIf

TCPCloseSocket($serwer) ;zamykamy socket serwera
TCPShutdown()
;############ NASZ SERWER ############
TCPStartup() ;uruchamiamy TCP

Global $serwer = TCPListen(@IPAddress1, 1337)
If @ Then ;jeśli nastąpi błąd
	MsgBox(16, "Błąd!", "Nie mozna uruchomić serwera - kod błędu "&@)
	TCPShutdown() ;pamiętamy zeby wyłączyć TCP zanim wyjdziemy
	Exit
EndIf

Local $client ;zmienna w której będzie trzymany socket klienta

Do
	$client = TCPAccept($serwer)
	Sleep(100) ;sleep, dajmy procesorowi odpocząć
Until $client <> -1 ;dopóki funkcja zwraca -1, powtarzaj pętlę

MsgBox(64, "Info", "Klient się połączył!")

TCPCloseSocket($client) ;odłączamy klienta
TCPCloseSocket($serwer) ;zamykamy serwer
TCPShutdown() ;zamykamy TCP
Zrobimy tak - serwer będzie wysyłał tekst do klienta, a klient wyświetli wysłany tekst w MsgBox'ie.

Wysyłanie w AutoIT odbywa się za pomocą funkcji TCPSend

TCPSend(socket, data)
socket to socket do którego chcemy wysłać dane, a data to wysyłane dane. Proste.

Co do socketa, to w naszym przypadku będziemy wysyłać dane do klienta - analogiczne więc że musimy podać zmienną z socketem klienta do tej funkcji.

 

Tekst możemy pobierać na przykład za pomocą funkcji InputBox. Tutaj zapraszam pod F1 żeby zapoznać się z parametrami.

 

W takim razie dopiszmy kod wysyłania wiadomości do serwera.

 

 

;############ NASZ SERWER ############
TCPStartup() ;uruchamiamy TCP

Global $serwer = TCPListen(@IPAddress1, 1337)
If @ Then ;jeśli nastąpi błąd
	MsgBox(16, "Błąd!", "Nie mozna uruchomić serwera - kod błędu "&@)
	TCPShutdown() ;pamiętamy zeby wyłączyć TCP zanim wyjdziemy
	Exit
EndIf

Local $client ;zmienna w której będzie trzymany socket klienta

Do
	$client = TCPAccept($serwer)
	Sleep(100) ;sleep, dajmy procesorowi odpocząć
Until $client <> -1 ;dopóki funkcja zwraca -1, powtarzaj pętlę

MsgBox(64, "Info", "Klient się połączył!")

Local $tekst = InputBox("TCP", "Wpisz tekst do wysłania")
TCPSend($client, $tekst) ;wysyłamy nasz tekst

TCPCloseSocket($client) ;odłączamy klienta
TCPCloseSocket($serwer) ;zamykamy serwer
TCPShutdown() ;zamykamy TCP
Ale to nie wystarczy - klient sam z siebie tej wiadomości nie odbierze i nie zinterpretuje. Żeby ją odebrał, najpierw musi jej nasłuchiwać. Służy do tego funkcja TCPRecv

TCPRecv(socket, długość [, flaga])
socket to socket z którego będziemy nasłuchiwać przychodzących danych, długość to dopuszczalna długość odebranych danych a flag (parametr opcjonalny) to flaga typu danych - ustawiona na 0 będzie automatycznie wykrywać czy dane są binarne czy tekstowe, ustawiona na 1 będzie traktować wszystkie wysyłane dane jako binarne.

W drugim wypadku musielibyśmy użyć StringToBinary/BinaryToString żeby odpowiednio przetworzyć stringa, ale nie musimy - wystarczy że flaga będzie ustawiona na 0, tak jak jest domyślnie.

 

Funkcja zwraca odebrane dane (jeśli jakieś są) a w wypadku kiedy nie odbierze danych to zwraca pustego stringa ("") i ustawia @ErroR.

 

Oczywiście musimy ją umieścić w pętli, żeby klient nasłuchiwał nieprzerwanie. Pętla powinna się przerwać gdy zostaną odebrane dane, a dane powinny zostać wyświetlone w MsgBoxie.

 

 

;############ NASZ KLIENT ############
TCPStartup()

Global $serwer = TCPConnect(@IPAddress1, 1337) ;próba połączenia z serwerem

If @ Then
	MsgBox(16, "Błąd!", "Nie udało się połączyć z serwerem - kod błędu: "&@)
	TCPShutdown() ;wyłączamy TCP
	Exit
EndIf

Local $recv
Do
	$recv = TCPRecv($serwer, 128) ;sprawdzamy czy czekają na nas jakieś dane do odebrania
Until $recv <> ""

MsgBox(64, "Odebrane dane", $recv)

TCPCloseSocket($serwer) ;zamykamy socket serwera
TCPShutdown()
Ot cała filozofia. Kompilujemy, odpalamy serwer a potem klienta i sprawdzamy czy działa. Nie rozpisałem się mocno, bo nie ma się tu o czym rozpisywać, jest to jedna z prostszych rzeczy - jak narazie. Hardkor zacznie się gdy będziemy pracować z większą ilością klientów, będziemy musieli ich wszystkich obsłużyć, itp, itd.

 

W następnej części pokażę jak zrobić przykładową sygnalizację programu (czyli np. kontrolę programu-klienta przez program-serwer), potem jeszcze zajmę się wysyłaniem plików i robieniem serwera dla dowolnej ilości klientów, a potem pokażę jak napisać porządny chat używając TCP. Ale to w kolejnych częściach kursu, narazie piszcie co jeszcze chcecie wiedzieć albo czego nie rozumiecie :D

846331404756772371599.jpeg
Opublikowano

Super, tak samo jak pierwsza część ;)

Cytat

That is not dead which can eternal lie. And with strange aeons even death may die.

 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...