Java/Socket: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m minima wikilinkizzazione
Riga 1:
Il [[Java (linguaggio)|linguaggio Java], tramite l'utilizzo di particolari [[Classe (informatica)|classi]] incluse nel suo package nativo, permette la gestione del flusso di dati su [[Rete informatica|reti]] basate sul [[Protocollo di rete|protocollo]] [[Transmission Control Protocol|TCP]]/[[IP]] e [[User Datagram Protocol|UDP]]/[[IP]].
 
Per il protocollo TCP si utilizzano le seguenti classi:
 
# '''InetAddress''', per la gestione degli [[indirizzi IP]]
# '''ServerSocket''', per la creazione di [[Socket (reti)|socket]] lato server
# '''Socket''', per la creazione di socket lato client
# '''DatagramSocket''', implementa i socket per la trasmissione senza connessione
# '''MulticastSocket''', fornisce supporto per i socket di tipo [[multicast]]
 
== Indirizzo IP ==
 
Nel Java un indirizzo IP è rappresentato dalla classe <code>InetAddress</code>: chequesta foniscefornisce tutitutti iquei metodi necessari a manipolare un indirizzo internet, necessario all'instradamento dei datudati sulla rete. eIn consente la trasformazione di un indirizzo nelle sue varie formeparticolare:
 
<code>getAllByName(String host)</code> - è una funzione che ritorna tutti gli indirizzi internet di un host dato il suo nome in forma estesa (esempio: getAllByName("www.wikipedia.org"))
 
<code>getByName(String host)</code> - ritorna una stringa rappresentante l'indirizzo IP dell'host nella forma decimale separata da un punto.
 
<code>getHostName()</code> ritorna una stringa rappresentante il nome dell'host.
 
== Socket Lato Server ==
 
Per realizzare un canale di comunicazione Client/Server occorre la crezione di un programma Server che funge da ascolto su una determinata porta, e di un programma Client che, effettuaremotamente, l'invocazionelo dello stessoinvochi.
 
Per la creazione del programma Server in Java è necessario seguereseguire i seguenti passaggi:
 
# *Importare i package <code>java.io</code> e <code>java.net</code> per poter utilizzare le classi <code>Socket</code> e <code>ServerSocket</code>
#* Intercettare l'eccezione <code>IOException</code> che deve essere gestita (tramite <code>try</code> &e </code>catch</code>) o propagata (tramite <code>throws<code>), dato che vengono richiamati metodi delle classi che appartengono ai package <code>java.io</code> e <code>java.net</code>.
#* Creare un oggetto <code>ServerSocket</code>, utilizzando il costruttore <code>ServerSocket (int port)</code> che si aspetta come parametro la porta del Server in ascolto per il servizio da attivare. Ad esempio :
ServerSocket server = new ServerSocket(9999);
Da notare che il numero corrispondente alla porta di ascolto non è una stringa.
#* Utilizzare il metodo <code>accept()</code> dell'oggetto <code>ServerSocket</code> per poter accettare le chiamate Client su un oggetto <code>Socket</code>:
 
# Utilizzare il metodo accept() dell'oggetto ServerSocket per poter accettare le chiamate Client su un oggetto Socket
Socket client = server.accept();
Il metodo che viene invocato ritorna un'oggetto socket<code>Socket</code> che potrà essere utilizzato per le comunicazioni con il client
#* Creare due oggetti <code>DataInputStream</code> e <code>DataOutputStream</code> per attivare uno stream di comunicazione con il cliente (ovviamente il <code>DataInputStream</code> servirà per leggere le richieste del client, e il <code>DataOutputStream</code> per inviare risposte al client):
DataInputStream is = new DataInputStream(server.getInputStream());
DataOutputStream os = new DataOutputStream(server.getOutputStream());
#* Richiamare il metodo <code>close()</code> sugli oggetti dello stream e sull'oggetto <code>ServerSocket</code> per chiuederechiudere i canali di comunicazione:
 
#Richiamare il metodo close() sugli oggetti dello stream e sull'oggetto ServerSocket per chiuedere i canali di comunicazione
os.close();
is.close();
server.close();
 
Per avere informazioni sul server in ascolto, javaJava mette a disposizione la classe <code>InetAddress</code> eed ili metodometodi <code>getInetAddress,</code> e <code>getLocalPort</code> per conoscereidentificare, rispettivamente, il nome del server e la porta impiegata.
 
Il metodo <code>getInetAddress</code> della classe <code>ServerSocket getInetAddress</code> permette di ottenere un dato che deve essere analizzato dalla classe <code>InetAddress</code> per poterpoterne ritornarericavare un valore stringstringa comprensibile. Dunque per conoscere l'indirizzo del server bisogna effettuare
Per avere informazioni sul server in ascolto java mette a disposizione la classe InetAddress e il metodo getInetAddress, getLocalPort per conoscere il nome del server e la porta.
Il metodo della classe ServerSocket getInetAddress permette di ottenere un dato che deve essere analizzato dalla classe InetAddress per poter ritornare un valore string comprensibile. Dunque per conoscere l'indirizzo del server bisogna effettuare
 
InetAddress indirizzo = server.getInetAddress();
String indirizzo_leggibile = indirizzo.getHostAddress();
 
Per quanto riguarda il numero della porta utilizzato per ascoltare le chiamate client, bastabisogna utilizzare il metodo <code>getLocalPort</code> della classe <code>ServerSocket</code> in questo modo
 
int porta = server.getLocalPort();
 
A livello di sviluppo l'implementazione corretta diimplementativo, un programma che fa daServer serverdeve prevedecontenere, dopo l'una inizializzazione del server, un ciclo, possibilmente infinito o condizionato da uscita del programma, diin cui viene atteso in ascoltomaniera sincrona il collegamento del client, creando: ad ogni cicloiterazione verrà creato un oggetto socket<code>Socket</code> che permetterà di averestabilire iltale contattocollegamento e congestirà il clientflusso edi gestiredati, la chiamata,ricavabili tramite la lettura della <code>DataInputStream</code>.
 
Un esempio di programmazione del server è:
Line 105 ⟶ 102:
A livello client i passaggi sono i seguenti:
 
#* Importare i package <code>java.io</code>, <code>java.net</code> per utilizzare le classi <code>Stream</code> (per i canali di comunicazione) e <code>Socket</code> (per il nostro scopo)
#* Intercettare l'eccezione <code>IOException</code> che deve essere gestita (tramite <code>try</code> &e <code>catch</code>) o propagata (tramite <code>throws</code>), dato che vengono richiamati metodi delle classi che appartengono ai package <code>java.io</code> e <code>java.net</code>.
#* Creare un oggetto <code>Socket</code> e specificare l'indirizzo IP ed il numero di porta in ascolto sul server, caratteristiche imposte dal TCP per la comunicazione server/client. A livello server bisogna dunque specificare il suo indirizzo IP o il nome ed inoltre bisogna specificare la porta in ascolto per il server che intende utilizzare. Ad esempio, se vogliamoper connetterciconnettersi al server chedescritto abbiamonegli creatoesempi primasopra, effettueremosi deve effettuare un'inizializzazione del socket nel seguente modo:
Socket client = new Socket("localhost",9999);
A livello client l'indirizzo IP viene ricavato mentre la porta viene assegnata in modo dinamico in base alla disponibilità .
#* Creare il canale di comunicazione con il server per inviare e ricevere messaggi tramite gli <code>Stream</code> di <code>Byte</code> in input ed output tramite le classi <code>DataInputStream</code> e <code>DataOutputStream</code>, associandole ai metodi della classe socket <code>getInputStream</code> e <code>getOutputStream</code> della classe <code>Socket</code>.
DataInputStream is = new DataInputStream(client.getInputStream());
DataOutputStream os = new DataOutputStream(client.getOutputStream());
 
#* Chidere gli stream di comunicazione e l'oggetto socket
 
is.close();
Line 123 ⟶ 120:
== Server Multithreading ==
 
Nella pratica succede spesso che un server deve poter gestire le richieste di più client (mettiamocome ad esempio lanella richiesta di una pagina web da parte di più browser). Per fare questo bisognaè conoscerenecessario leattivare basiun dellathread separato per ogni richiesta: si deve pertanto sfruttare la programmazione multithreading inmessa java,a eddisposizione effettuaredal Java, effettuando un'estensione della classe <code>Thread</code> (o, alternativamente, un'implementazione dell'interfaccia <code>Runnable</code>).
 
EccoQuello unche modosegue per creareè un esempio di server multithread. Sostanzialmente la tecnica siè occupaquella di creare un oggetto che funga da server, e tante sessioni, diin server.acceptthread separati, quante chiamate vengono effettuate dai client.
 
#*Per prima cosa si importano le librerie java.io e java.net
import java.io.*;
import java.net.*;
 
#* la classe che gestisce il server sarà un'estensione della classe <code>Thread</code>
class serverMT extends Thread {
 
#* dichiarovengono dichiarate alcune variabili all'interno della classe che verrano utilizzate in seguito
private Socket s; //socket di connessione con il client
private BufferedReader in; //stream di input
Line 140 ⟶ 137:
private String myclient;
 
#il* Il costruttore della classe ha come oggetto il socket del client che effettua la richiesta di connessione al server. Inoltre in qusta fase ci si occupa di aprire il canale di comunicazione e di mandare infar runpartire il thread associato alla gestione del servizio
public serverMT(Socket s) throws IOException {
this.s = s;
in = new BufferedReader(new InputStreamReader(s.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())),true);
this.start();
}
 
#funzione* Funzione che permette la gestione del servizio, verrà chiamata a seguito di <code>this.start()</code> dell'oggetto serverMT:
public void run() {
try {