XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
Introduzione al linguaggio Java
1. Java per elettronici ed elettrotecnici
Terza lezione: applicazioni di rete
ITIS Max Planck di Lancenigo di Villorba
A.S. 2012-2013
Prof. PAOLO TOSATO
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
2. 2
Indice
Paolo Tosato Java per elettronici ed elettrotecnici
03/05/2013
• I thread
• I socket
• Esempi: cominciamo a chattare
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
3. 3
Stati di un thread
• New: quando viene creato
• Runnable: quando si chiama start(),
ma non è necessariamente in
esecuzione, può ricevere la CPU
• Not runnable: non può avere CPU
• Dead: termine
I thread
In Java
• esecuzione concorrente di codice di oggetti della stessa classe o di classi diverse
• istanza della classe Thread
Un thread è creato implicitamente quando diamo il comando java <nome file>
public static void main(String[] args) {
Thread t = Thread.currentThread();
System.out.println("Nome: " + t.getName());
System.out.println("Priorità: " + t.getPriority());
// da 1 (Thread.MIN_PRIORITY) a 10 (Thread.MAX_PRIORITY)
}
03/05/2013
Paolo Tosato Java per elettronici ed elettrotecnici
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
4. I thread
Java offre delle primitive per il multithreading, primitive non presenti in C/C++
• Thread.sleep(millisecondi): sospende il thread per un certo numero di
millisecondi
• t.yield(): pone il thread t nella lista dei thread “runnable” e da la possibilità a un
thread della stessa priorità di essere eseguito
• t.isAlive(): true se t non è nello stato dead
• t.join(): aspetta la fine del thread t prima di continuare
• t.start(): avvia l’esecuzione del thread t // metodo ASINCRONO
• t.stop(): termina il thread t // metodo DEPRECATED
Paolo Tosato Java per elettronici ed elettrotecnici
403/05/2013
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
5. I thread
public class PingPong extends Thread {
String parola;
boolean stop = false;
public PingPong (String parola) {
this.parola = parola;
}
public void run() {
while (!stop) {
System.out.println(parola);
}
}
public void ferma() {
stop = true;
}
}
Paolo Tosato Java per elettronici ed elettrotecnici
503/05/2013
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
public class ProvaThread {
public static void main(String args[]) {
final int ATTESA = 5000;
PingPong ping = new PingPong(“Ping”);
PingPong pong = new PingPong(“Pong”);
ping.start();
pong.start();
try {
Thread.sleep(ATTESA);
} catch (InterruptedException e) {
e.printStackTrace();
}
ping.ferma();
pong.ferma();
}
}
6. 6
Si chiamano applicazioni distribuite le applicazioni la cui esecuzione è distribuita tra
più computer; parti dell’applicazione si trovano su computer diversi e lavorano
assieme.
I socket
03/05/2013
In Java
• Applicazioni client/server: i socket
• RMI (Remote Method Invocation): richiamare metodi di un oggetto remoto
• presenza di un registro remoto: rmiregistry
• utilizzano di default i socket TCP
Paolo Tosato Java per elettronici ed elettrotecnici
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
7. I socket
Paolo Tosato Java per elettronici ed elettrotecnici
703/05/2013
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Socket
• identifica un computer e un processo sul computer
• è formato da un indirizzo IP che identifica un computer sulla rete e da un numero di
porta che identifica un processo o un’applicazione sul computer (da 0 a 65.535 – i primi
1024 numeri sono Well Known Port Number)
In un’applicazione client/server
• il server apre un socket e resta in attesa di connessioni (apertura passiva)
• il client chiama il socket del server per iniziare la connessione (apertura attiva)
8. 8
*** IL SERVER ***
import java.io.*; import java.net.*;
public class Server {
private ServerSocket server;
private Socket connessione;
private BufferedReader dalClient;
private PrintStream alClient; // Scrive bytes mentre PrintWriter scrive caratteri
public Server() { // costruttore
try {
// port (20000): se = 0 sceglie la prima porta libera
// backlog (5): lunghezza massima della coda delle richieste di connessione
server = new ServerSocket(20000, 5); // DatagramSocket per connessioni UDP
System.out.println("Server attivo");
connessione = server.accept();
dalClient = new BufferedReader(new InputStreamReader(connessione.getInputStream()));
alClient = new PrintStream(connessione.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
Esempi: cominciamo a chattare
03/05/2013
Paolo Tosato Java per elettronici ed elettrotecnici
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
9. public void conversazione() {
String messaggio = "";
BufferedReader tastiera = new BufferedReader(new InputStreamReader(System.in));
try {
alClient.println("Salve");
while(!messaggio.equals("fine")) {
messaggio = dalClient.readLine();
System.out.println(messaggio);
if (!messaggio.equals("fine")) {
messaggio = tastiera.readLine();
alClient.println(messaggio);
}
}
connessione.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
Esempi: cominciamo a chattare
Paolo Tosato Java per elettronici ed elettrotecnici
903/05/2013
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
10. 10
*** IL CLIENT ***
import java.io.*; import java.net.*;
public class Client {
private Socket connessione;
private BufferedReader dalServer;
private PrintStream alServer; // Scrive bytes mentre PrintWriter scrive caratteri
public Client() {
BufferedReader tastiera = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.println("Inserire l'indirizzo del server");
String indirizzo = tastiera.readLine();
connessione = new Socket(indirizzo, 20000);
dalServer = new BufferedReader(new InputStreamReader(connessione.getInputStream()));
alServer = new PrintStream(connessione.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
Esempi: cominciamo a chattare
03/05/2013
Paolo Tosato Java per elettronici ed elettrotecnici
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
11. public void conversazione() {
String messaggio = "";
BufferedReader tastiera = new BufferedReader(new InputStreamReader(System.in));
try {
while(!messaggio.equals("fine")) {
messaggio = dalServer.readLine();
System.out.println(messaggio);
if (!messaggio.equals("fine")) {
messaggio = tastiera.readLine();
alServer.println(messaggio);
}
}
connessione.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
Esempi: cominciamo a chattare
Paolo Tosato Java per elettronici ed elettrotecnici
1103/05/2013
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
12. 12
*** MAIN DEL SERVER ***
public class ProvaServer {
public static void main(String[] args) {
Server server = new Server();
server.conversazione();
}
}
Esempi: cominciamo a chattare
03/05/2013
Paolo Tosato Java per elettronici ed elettrotecnici
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
*** MAIN DEL CLIENT ***
public class ProvaClient {
public static void main(String[] args) {
Client client = new Client();
client.conversazione();
}
}
13. 13
import java.io.*;
import java.net.*;
public class Server extends Thread {
private ServerSocket server;
public Server() {
try {
server = new ServerSocket(20000, 5);
System.out.println("Server attivo");
this.start();
} catch (IOException e) {
e.printStackTrace();
}
}
Esempi: cominciamo a chattare
03/05/2013
Paolo Tosato Java per elettronici ed elettrotecnici
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
public void run() {
try {
while (true) {
Socket richiestaClient = server.accept();
/* Quando un client cerca di connettersi,
il server genera un thread
per gestire quel client
*/
new Connessione(richiestaClient);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
*** SERVER multithreading per gestire più client contemporaneamente ***
14. Esempi: cominciamo a chattare
Paolo Tosato Java per elettronici ed elettrotecnici
1403/05/2013
Quest' opera è distribuita con
licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
import java.io.*;
import java.net.*;
public class Connessione extends Thread {
private Socket connessione;
private BufferedReader dalClient;
private PrintStream alClient;
public Connessione(Socket richiestaClient) {
try {
connessione = richiestaClient;
dalClient = new BufferedReader(
new InputStreamReader(
connessione.getInputStream()));
alClient = new PrintStream(
connessione.getOutputStream());
this.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
try {
String messaggio = "";
alClient.println("Salve");
while (!messaggio.equals("fine")) {
messaggio = dalClient.readLine();
alClient.println(messaggio);
}
connessione.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class ProvaServer {
public static void main(String[] args) {
// il server va chiuso manualmente,
// per esempio Ctrl-C
Server server = new Server();
}
}