Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.X] SFML 2.X - TCP/IP - Prosta aplikacja Klient-Server

Ostatnio zmodyfikowano 2024-11-21 01:46
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
[SFML 2.X] SFML 2.X - TCP/IP - Prosta aplikacja Klient-Server
» 2024-11-19 18:36:11

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 transportowa
Odpowiada 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 aplikacji
Dane generowane przez aplikację (np. wysłanie e-maila) są przekazywane przez warstwę aplikacji do niższych warstw.

Segmentacja i transport
W 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 IP
W 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 danych
U 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 chmurowe
Dostarczają 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

C/C++
#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 ) {
           
           
// Próba odbioru wiadomości
           
char buffer[ 100 ]; // Bufor do przechowywania wiadomości
           
std::size_t received; // Ilość odebranych bajtów
           
           
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

C/C++
#include <iostream>
#include <SFML/System.hpp>
#include <SFML/Network.hpp>
using namespace std;

int main() {
   
// Tworzymy obiekt socketu
   
sf::TcpSocket socket;
   
   
// adres IP i port servera
   
sf::IpAddress serverIP = "192.168.97.73";
   
unsigned short port = 53000;
   
   
// Próba połączenia z serwerem
   
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";
   
   
// Wiadomość do wysłania
   
std::string message = "Hello!";
   
   
while( true ) {
       
// Wysyłamy wiadomość do serwera
       
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 ) );
   
}
   
   
// Zamknięcie połączenia z serwerem
   
socket.disconnect();
   
   
return 0;
}

Opracowano przy pomocy ChatGPT. Kod autorstwa tBane.
P-181931
« 1 »
  Strona 1 z 1