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
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
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.
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.
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
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.
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
*** 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.
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
*** 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.
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
*** 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
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 ***
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();
}
}

Introduzione al linguaggio Java

  • 1.
    Java per elettronicied 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 Javaper 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 unthread • 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 offredelle 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 classPingPong 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 applicazionidistribuite 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 TosatoJava 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 DELSERVER *** 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.*; publicclass 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 achattare 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(); } }