Java/Socket: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Riga 114:
Nella pratica succede spesso che un server deve poter gestire le richieste di più client (mettiamo ad esempio la richiesta di una pagina web da più browser). Per fare questo bisogna conoscere le basi della programmazione multithreading in java, ed effettauare un'estensione della classe Thread o un'implementazione dell'interfaccia Runnable.
 
Ecco un modo per creare un server multithread. Sostanzialmente la tecnica si occupa di creare un oggetto server e tante sessioni di server.accept quante chiamate vengono effettuate dai client.
I passi da seguire sono i seguenti:
 
#Per comeprima percosa losi sviluppo di un server non multithreading, bisogna importareimportano le classilibrerie java.io e java.net
import java.io.*;
# l'eccezione IOException in questo caso dovrà essere gestita e non rimandata alla funzione chiamante.
import java.net.*;
# si inizializza la classe ServerThread (o il nome che le si vuole dare) che dovra estendere la classe Thread
class ServerThread extends Thread
 
# la classe che gestisce il server sarà un'estensione della classe Thread
# il costruttore della class ServerThread avrà come parametro il socket da gestire che verrà salvato in una variabile privata della classe
class ServerThreadserverMT extends Thread {
private Socket socket;
public ServerThread(Socket socket)
{
this.socket = socket;
}
 
# dichiaro alcune variabili all'interno della classe che verrano utilizzate in seguito
# a questo punto si dovrà estendere la classe run (della superclasse Runnable) e gestire l'eccezione IOException tramite try & catch
private Socket s; //socket di connessione con il client
# all'interno del blocco try si deve inizializzare il canale di comunicazione con il client e "ascoltare" sullo stream i dati che esso invia.
private BufferedReader in; //stream di input
private PrintWriter out; //stream di output
private String myclient;
 
#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 in run il thread associato alla gestione del servizio
# bisogna creare una classe che permetterà di gestire le '''n''' chiamate dei client
public serverMT(Socket s) throws IOException {
Questa classe non fa altro che inizializzare un'elemento della classe serverSocket (prima visto) e ad ogni chiamata del client generare un nuovo thread ServerThread
this.sockets = sockets;
in = new BufferedReader(new InputStreamReader(s.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())),true);
this.start();
}
 
#funzione che permette la gestione del servizio, verrà chiamata a seguito di this.start() dell'oggetto serverMT
public void run() {
try {
myclient = in.readLine();
while (true) {
String str = in.readLine();
if (str.equals("END")) break;
System.out.println("Ricevuto da C" + myclient + " e rispedito " + str);
out.println(str);
}
System.out.println("chiusura...");
s.close();
{}
catch(IOException e) {System.out.println("Eccezione");}
}
}