Java Socket
Java socket cu exemplu cod
Proiect-ul complet pe Github:
RitanMihai/Sockets-TW: A small project to show how sockets work (github.com).
Definiție: În esență un socket reprezintă un terminal care este identificat printr-un IP.
Există mai multe tipuri de sockets pe care îi putem folosi în funcție de nevoile noastre, câteva exemple:
- Datagram Sockets
- Stream Sockets
- Raw Sockets
Și aceste terminale comunică între ele cu ajutorul unui protocol. Două protocoale bine cunoscute sunt: TCP și UDP.
În cele ce urmează vom folosi și exemplifica Stream Sockets printr-o conexiune TCP.
În protocolul tradițional Request-Response (Cerere-Răspuns) avem o limitare majoră, un server poate trimite date către client numai când acesta cere. Protocolul TCP rezolvă această problemă lăsând serverul și clientul să comunice între ele (să trimită răspunsuri și cereri) oricând.
Serverul
Serverul ruleză pe o rețea internet pe un port precizat și așteaptă conectări din partea clienților. Detectăm și obținem conexiunea cu un client cu ajutorul funcției accept().
În exemplul de mai sus putem observa că avem o aplicație Server-Multi Client și că pentru fiecare client am alocat un nou fir de execuție.
ServerThread este o clasă definită de noi care moștenește clasa Thread și scopul acesteia este de a prelucra datele venite de la utilizator.
Esențial de reținut din codul precedent este că pentru a citi și scrie date înapoi către client folosim intstanțe ale claselor ObjectInputStream și ObjectOutputStream. Instanțierea se face în cazul acesta în constructorul clasei.
De altfel observăm când vrem să transmitem date că noi folosim o clasă Packet.
Puteam transmite direct șiruri de caractere sau alte tipuri de date primitive, dar prin acest exemplu am vrut să arăt cum putem transmite obiecte întregi mult mai complexe. Packet conține doar un string în cazul de față, dar dacă dorim putem adăuga oricâți alți membrii.
Când folosim obiecte implementate de noi trebuie neapărat ca acestea sa fie o implementare a interfeței Serializable.
Și dezavantajul major este că atât serverul cât și clientul trebuie să aibă această clasă în proiect.
Clientul
Clientul trebuie să știe exact la ce rețea (în cazul nostru local host) și port să se conecteze.
La fel precum serverul se folosește de clasele ObjectInputStream și ObjectOutputStream pentru comunicare și menține conexiunea cu ajutorul unui bloc repetitiv while.