SFML 2.X - TCP/IP - Prosta aplikacja Klient-Server
W tym poradniku wyjaśniono pojęcia TCP/IP, serwera, klienta oraz przedstawiono podstawową aplikację klient-serwer.
Co to jest TCP/IP?
TCP/IP to zestaw protokołów komunikacyjnych stanowiący podstawę działania internetu oraz większości współczesnych sieci komputerowych. Nazwa pochodzi od dwóch kluczowych protokołów w tym modelu: TCP (Transmission Control Protocol) i IP (Internet Protocol). Razem tworzą standardowy sposób przesyłania danych w sieci.
Kluczowe elementy TCP/IP
Model TCP/IP składa się z czterech warstw, z których każda odpowiada za inne aspekty komunikacji sieciowej:
Warstwa aplikacji:-Zapewnia interfejs do aplikacji użytkownika, takich jak przeglądarki internetowe czy klienty poczty e-mail.
-Przykłady protokołów: HTTP, HTTPS, FTP, SMTP, DNS.
Warstwa transportowaOdpowiada za niezawodne przesyłanie danych między urządzeniami.
Kluczowe protokoły:
-TCP – zapewnia niezawodność, kontrolę błędów i kolejność danych.
-UDP – szybszy, ale mniej niezawodny protokół stosowany np. w transmisjach na żywo.
Warstwa internetowa (sieciowa)-Zarządza adresowaniem i trasowaniem danych, umożliwiając ich przesyłanie między różnymi sieciami.
-Kluczowy protokół: IP (Internet Protocol), który definiuje adresy IP urządzeń w sieci i pozwala na ich lokalizację.
Warstwa dostępu do sieci (łączności)-Odpowiada za przesyłanie danych przez fizyczne medium, takie jak kable ethernetowe, Wi-Fi czy światłowody.
-Obsługuje technologię sprzętową i protokoły niskopoziomowe, np. Ethernet, Wi-Fi, ARP.
Jak działa TCP/IP?
Tworzenie danych w aplikacjiDane generowane przez aplikację (np. wysłanie e-maila) są przekazywane przez warstwę aplikacji do niższych warstw.
Segmentacja i transportW warstwie transportowej dane są dzielone na segmenty. Jeśli używany jest TCP, każdy segment ma informacje o kolejności i kontroli błędów.
Dodawanie adresów IPW warstwie internetowej każdy segment zostaje opakowany w pakiet IP z adresami nadawcy i odbiorcy.
Przesyłanie danych przez siećPakiety są przesyłane przez różne urządzenia sieciowe (routery, przełączniki), aż dotrą do odbiorcy.
Składanie danychU odbiorcy dane są składane w pierwotnej kolejności i przekazywane do aplikacji.
Przykłady zastosowań TCP/IP:
-Przeglądanie internetu – HTTP/HTTPS używa TCP/IP do przesyłania stron WWW.
-Wysyłanie e-maili – SMTP, POP3 czy IMAP działają na protokołach TCP/IP.
-Strumieniowanie wideo – UDP/IP lub TCP/IP służy do przesyłania treści multimedialnych.
-Przesyłanie plików – FTP używa TCP/IP do transferu danych.
Co to jest serwer?
Serwer to komputer lub system komputerowy udostępniający usługi, dane lub zasoby innym urządzeniom (klientom) w sieci. Działa jako centralny punkt komunikacji, przetwarzania i przechowywania informacji, obsługując żądania klientów, takich jak komputery osobiste, smartfony czy inne urządzenia sieciowe.
Kluczowe cechy serwera:
-Funkcjonalność w sieci: Serwery działają w sieciach lokalnych (LAN) lub globalnych (np. w internecie), umożliwiając dostęp do swoich zasobów.
-Stała praca: Serwery są zaprojektowane do pracy 24/7, aby zapewnić ciągły dostęp do usług.
-Wysoka wydajność: Często mają większą moc obliczeniową, więcej pamięci RAM i bardziej wydajne dyski niż zwykłe komputery.
-Bezpieczeństwo: Serwery często obsługują zaawansowane systemy zabezpieczeń, aby chronić dane i użytkowników.
Rodzaje serwerów:
Serwery plików-Przechowują i udostępniają pliki w sieci.
-Umożliwiają współdzielenie dokumentów, zdjęć, wideo itp.
Serwery WWW (HTTP)-Obsługują strony internetowe i aplikacje dostępne przez przeglądarki.
-Przykład: Serwer Apache, Nginx.
Serwery baz danych-Przechowują dane w strukturach bazodanowych i umożliwiają szybkie ich przeszukiwanie oraz modyfikację.
-Przykład: MySQL, PostgreSQL.
Serwery pocztowe-Obsługują wysyłanie, odbieranie i przechowywanie wiadomości e-mail.
-Przykład: Microsoft Exchange, Postfix.
Serwery gier-Umożliwiają graczom łączenie się i grę w trybie multiplayer.
-Przykład: Serwery Minecraft, CS
Serwery aplikacji-Hostują aplikacje biznesowe lub użytkowe, umożliwiając ich uruchamianie przez sieć.
Serwery proxy-Działają jako pośrednik między klientem a innymi serwerami, poprawiając bezpieczeństwo i wydajność.
Serwery chmuroweDostarczają usługi w modelu chmurowym, np. Amazon AWS, Google Cloud.
Jak działa serwer?
-Odbieranie żądań: Klient (np. przeglądarka internetowa) wysyła zapytanie do serwera.
-Przetwarzanie danych: Serwer analizuje żąd
Co to jest klient?
Klient to urządzenie, program lub użytkownik, który wysyła żądania do serwera w celu uzyskania danych, usług lub zasobów. W modelu klient-serwer klient inicjuje komunikację, a serwer odpowiada na jego żądania.
Kluczowe cechy klienta:
-Inicjowanie żądań: Klient rozpoczyna komunikację, przesyłając zapytania do serwera.
-Odbieranie odpowiedzi: Po przetworzeniu żądania serwer przesyła odpowiedź, którą klient odbiera i przetwarza.
-Interakcja z użytkownikiem: W większości przypadków klient to oprogramowanie, które pozwala użytkownikowi korzystać z usług oferowanych przez serwer (np. przeglądarka internetowa umożliwia przeglądanie stron WWW)
Typy klientów:
Urządzenia klienckie:-Komputery osobiste, laptopy, smartfony, tablety czy inne urządzenia podłączone do sieci.
Oprogramowanie klienckie:Programy, które komunikują się z serwerem, np.:
-Przeglądarki internetowe (Chrome, Firefox) – klienci serwerów WWW.
-Klienty pocztowe (Outlook, Thunderbird) – klienci serwerów pocztowych.
-Gry sieciowe – klienci serwerów gier.
-Aplikacje mobilne – klienci serwerów aplikacji.
Użytkownicy końcowi:-Osoby korzystające z urządzeń i aplikacji, które działają jako klienci.
Jak działa klient?
Wysyłanie żądania:Klient wysyła żądanie do serwera. Na przykład, przeglądarka internetowa prosi o załadowanie strony WWW poprzez protokół HTTP/HTTPS.
Odbieranie odpowiedzi:Serwer przetwarza żądanie i przesyła odpowiedź do klienta, np. w formie pliku HTML, który przeglądarka wyświetla jako stronę internetową.
Wyświetlanie danych:Klient interpretuje dane zwrócone przez serwer i prezentuje je użytkownikowi w zrozumiałej formie.
Przykłady relacji klient-serwer:
Przeglądanie internetu:-Klient: przeglądarka internetowa.
-Serwer: serwer WWW (np. Google, YouTube).
-Klient wysyła zapytanie o stronę, a serwer przesyła odpowiedź w postaci kodu HTML, CSS i JavaScript.
Wysyłanie e-maila:-Klient: aplikacja pocztowa (np. Thunderbird).
-Serwer: serwer poczty (SMTP, IMAP).
-Klient wysyła wiadomość, a serwer ją przesyła do odbiorcy.
Gra multiplayer:-Klient: gra uruchomiona na komputerze lub konsoli.
-Serwer: serwer gier.
-Klient komunikuje się z serwerem, przesyłając dane o działaniach gracza i odbierając dane o działaniach innych graczy.
Aplikacja Server
#include <iostream>
#include <SFML/System.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/Network.hpp>
using namespace std;
sf::RenderWindow * window;
sf::TcpListener listener;
sf::TcpSocket client1;
int main()
{
window = new sf::RenderWindow( sf::VideoMode( 720, 480 ), "SERVER" );
window->setFramerateLimit( 5 );
sf::IpAddress localIP = sf::IpAddress::getLocalAddress();
sf::IpAddress publicIP = sf::IpAddress::getPublicAddress();
cout << "Adres IP lokalny (LAN): " << localIP << "\n";
cout << "Adres IP publiczny: " << publicIP << "\n";
if( listener.listen( 53000 ) != sf::Socket::Done ) {
cout << "Nie udało się nasłuchiwać na porcie 53000\n";
return - 1;
}
cout << "Server listening on 53000\n";
bool waiting_for_client = true;
while( window->isOpen() )
{
while( waiting_for_client == true ) {
if( listener.accept( client1 ) != sf::Socket::Done ) {
cout << "not connecting\n";
return - 1;
}
cout << "client " << client1.getRemoteAddress() << " conecting\n";
waiting_for_client = false;
}
bool server_run = true;
while( server_run ) {
char buffer[ 100 ]; std::size_t received; if( client1.receive( buffer, sizeof( buffer ), received ) != sf::Socket::Done ) {
cout << "Error receiving message\n";
}
else {
cout << "Received message: " << buffer << "\n";
}
}
sf::Event event;
while( window->pollEvent( event ) ) {
if( event.type == sf::Event::Closed ) {
window->close();
}
cout << "nasłuchuję ... \n";
}
window->clear();
window->display();
}
return 0;
}
Aplikacja Klient
#include <iostream>
#include <SFML/System.hpp>
#include <SFML/Network.hpp>
using namespace std;
int main() {
sf::TcpSocket socket;
sf::IpAddress serverIP = "192.168.97.73";
unsigned short port = 53000;
if( socket.connect( serverIP, port ) != sf::Socket::Done ) {
cout << "Nie udało się połączyć z serwerem\n";
return - 1;
}
cout << "Połączono z serwerem: " << serverIP << ":" << port << "\n";
std::string message = "Hello!";
while( true ) {
if( socket.send( message.c_str(), message.length() + 1 ) != sf::Socket::Done ) {
cout << "Nie udało się wysłać wiadomości\n";
return - 1;
} else
cout << "send - \"Hello!\\n";
sf::sleep( sf::seconds( 10 ) );
}
socket.disconnect();
return 0;
}
Opracowano przy pomocy ChatGPT. Kod autorstwa tBane.