Corso di Reti di Calcolatori
UNICAL – Facoltà di Ingegneria – a.a. 2002/2003
Esercitazione sul networking in Java (3a parte)
e comandi di rete
[email protected]
1
Datagrammi
Le applicazioni che comunicano tramite socket possiedono un canale di
comunicazione dedicato. Per comunicare, un client ed un server stabiliscono
una connessione, trasmettono dati, quindi chiudono la connessione. Tutti i
dati inviati sul canale sono ricevuti nello stesso ordine in cui sono stati inviati.
Le applicazioni che comunicano tramite datagrammi inviano e ricevono
pacchetti di informazione completamente indipendenti tra loro. Queste
applicazioni non dispongono e non necessitano di un canale di
comunicazione punto-a-punto. La consegna dei datagrammi alla loro
destinazione non è garantita, e neppure l’ordine del loro arrivo.
Il package java.net fornisce tre classi che consentono di scrivere applicazioni
che usano datagrammi per inviare e ricevere pacchetti sulla rete:
DatagramSocket, DatagramPacket e MulticastSocket. Una applicazione
può inviare e ricevere DatagramPacket tramite un DatagramSocket. Inoltre, i
DatagramPacket possono essere inviati in broadcast a più destinatari che
sono in ascolto su un MulticastSocket.
NOTA: MulticastSocket estende DatagramSocket
2
java.net.DatagramSocket
• DatagramSocket (int port)
Crea un DatagramSocket e lo collega alla porta specificata sulla
macchina locale.
• void receive (DatagramPacket p)
Riceve un DatagramPacket da questo socket.
• void send (DatagramPacket p)
Invia un DatagramPacket su questo socket.
• void close ()
Chiude questo DatagramSocket.
3
java.net.DatagramPacket
• DatagramPacket (byte[] buf, int length)
Crea un DatagramPacket per ricevere pacchetti di lunghezza length.
• DatagramPacket (byte[] buf, int length,
InetAddress address, int port)
Crea un DatagramPacket per inviare pacchetti di lunghezza length
all’host ed alla porta specificati.
• InetAddress getAddress ()
Restituisce l’indirizzo IP della macchina alla quale questo DatagramPacket
deve essere inviato o da cui è stato ricevuto.
• int getPort ()
Restituisce la porta della macchina alla quale questo DatagramPacket
deve essere inviato o da cui è stato ricevuto.
4
TimeServer (1)
import java.io.*;
import java.net.*;
import java.util.*;
public class TimeServer {
public static void main(String[] args) {
DatagramSocket socket = null;
try {
socket = new DatagramSocket(3575);
int n = 1;
while (n <= 10) {
byte[] buf = new byte[256];
// riceve la richiesta
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
// produce la risposta
String dString = new Date().toString();
buf = dString.getBytes();
5
TimeServer (2)
// invia la risposta al client
InetAddress address = packet.getAddress();
int port = packet.getPort();
packet = new DatagramPacket(buf, buf.length, address, port);
socket.send(packet);
n++;
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
socket.close();
}
}
}
6
TimeClient (1)
import java.io.*;
import java.net.*;
import java.util.*;
public class TimeClient {
public static void main(String[] args) throws IOException {
String hostname = "localhost";
DatagramSocket socket = new DatagramSocket();
// invia la richiesta
byte[] buf = new byte[256];
InetAddress address = InetAddress.getByName(hostname);
DatagramPacket packet =
new DatagramPacket(buf, buf.length, address, 3575);
socket.send(packet);
7
TimeClient (2)
// riceve la risposta
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
// visualizza la risposta
String received = new String(packet.getData());
System.out.println("Response: " + received);
socket.close();
}
}
8
java.net.MulticastSocket
• MulticastSocket (int port)
Crea un MulticastSocket e lo collega alla porta specificata sulla
macchina locale.
• void joinGroup (InetAddress mcastaddr)
Si collega ad un multicast group.
• void leaveGroup (InetAddress mcastaddr)
Abbandona un multicast group.
• void receive (DatagramPacket p)
Riceve un DatagramPacket da questo socket.
• void send (DatagramPacket p)
Riceve un DatagramPacket da questo socket.
• void close ()
Chiude questo MulticastSocket.
9
MulticastTimeServer (1)
import java.io.*;
import java.net.*;
import java.util.*;
public class MulticastTimeServer {
public static void main(String[] args) {
MulticastSocket socket = null;
try {
socket = new MulticastSocket(3575);
int n = 1;
while (n <= 100) {
byte[] buf = new byte[256];
// non aspetta la richiesta
String dString = new Date().toString();
buf = dString.getBytes();
10
MulticastTimeServer (2)
// invia il messaggio in broadcast
InetAddress group = InetAddress.getByName("230.0.0.1");
DatagramPacket packet =
new DatagramPacket(buf, buf.length, group, 3575);
socket.send(packet);
System.out.println ("Broadcasting: "+dString);
Thread.sleep(1000);
n++;
}
socket.close();
}
catch (Exception e) {
e.printStackTrace();
socket.close();
}
}
}
11
MulticastTimeClient
import java.io.*; import java.net.*; import java.util.*;
public class MulticastTimeClient {
public static void main(String[] args) throws IOException {
MulticastSocket socket = new MulticastSocket(3575);
InetAddress group = InetAddress.getByName("230.0.0.1");
socket.joinGroup(group);
DatagramPacket packet;
for (int i = 0; i < 100; i++) {
byte[] buf = new byte[256];
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String received = new String(packet.getData());
System.out.println("Time: " + received);
}
socket.leaveGroup(group);
socket.close();
}
}
12
ping (1)
Invia una successione di pacchetti all'host specificato, per
verificare l'integrità e la qualità della connessione.
Sintassi Windows:
ping [-t] [-n conteggio] [-w timeout] hostname
Opzioni:
-t Effettua un ping sull'host specificato finché non viene
interrotto. Per interrompere digitare Ctrl-C.
-n conteggio Numero di richieste di eco da inviare.
-w timeout Timeout in millisecondi per ogni risposta.
13
ping (2)
C:\>ping java.sun.com
Esecuzione di Ping java.sun.com [192.18.97.71] con 32 byte di
dati:
Risposta da 192.18.97.71: byte=32 durata=210ms TTL=241
Risposta da 192.18.97.71: byte=32 durata=201ms TTL=241
Risposta da 192.18.97.71: byte=32 durata=200ms TTL=241
Risposta da 192.18.97.71: byte=32 durata=201ms TTL=241
Statistiche Ping per 192.18.97.71:
Pacchetti: Trasmessi = 4, Ricevuti = 4, Persi = 0 (0% persi),
Tempo approssimativo percorsi andata/ritorno in millisecondi:
Minimo = 200ms, Massimo = 210ms, Medio = 203ms
14
host (1)
Effettua la risoluzione (diretta ed inversa) dell’host specificato
Sintassi Linux (non disponibile sotto Windows):
host hostname [server]
Opzioni:
server è il nome del server DNS da utilizzare (se non
specificato usa il DNS di default)
15
host (2)
# host java.sun.com
java.sun.com. has address 192.18.97.71
# host www.deis.unical.it
www.deis.unical.it. is an alias for haldo.deis.unical.it.
haldo.deis.unical.it. has address 160.97.27.7
# host 192.18.97.71
71.97.18.192.in-addr.arpa. domain name pointer
flres.java.Sun.COM.
16
nslookup
Effettua la risoluzione (diretta ed inversa) dell’host specificato.
C:\>nslookup java.sun.com
Server: dns.isi.cs.cnr.it
Address: 194.119.198.151
Nome: java.sun.com
Address: 192.18.97.71
C:\>nslookup 192.18.97.71
Server: dns.isi.cs.cnr.it
Address: 194.119.198.151
Nome: flres.java.Sun.COM
Address: 192.18.97.71
17
traceroute (1)
Mostra tutti i router che un pacchetto attraversa per raggiungere
l’host di destinazione
Sintassi Windows:
tracert [-d] [-h max_salti] [-w timeout] hostname
Opzioni:
-d Non risolve gli indirizzi in nome host.
-h max_salti Numero massimo di punti di passaggio per
ricercare la destinazione.
-w timeout Timeout in millisecondi per ogni risposta.
18
traceroute (2)
C:\>tracert java.sun.com
Rilevazione instradamento verso java.sun.com [192.18.97.71]
su un massimo di 30 punti di passaggio:
1 <10 ms <10 ms <10 ms 194.119.198.129
2 <10 ms 30 ms 10 ms 10.0.0.134
3 40 ms 30 ms 40 ms rc-cnrcs.na.garr.net [193.206.130.125]
4 20 ms 60 ms 60 ms rt-rc-1.na.garr.net [193.206.134.169]
5 30 ms 30 ms 40 ms mi-na.garr.net [193.206.134.9]
6 40 ms 41 ms 30 ms rtg-rt.mi.garr.net [193.206.134.206]
7 30 ms 40 ms 40 ms rm-mi-g.garr.net [193.206.134.14]
8 40 ms 50 ms 40 ms mno-vcn-i1-pos0-2.telia.net [213.248.79.125]
…
12 190 ms 190 ms 211 ms nyk-bb1-pos1-0-0.telia.net [213.248.80.13]
13 200 ms 190 ms 201 ms sl-gw9-nyc-7-2.sprintlink.net [144.232.169.61]
…
18 230 ms 231 ms 220 ms sl-gw14-che-8-0.sprintlink.net [144.232.15.162]
19 220 ms 211 ms 210 ms sl-internap-26-0-0.sprintlink.net [160.81.54.46]
20 230 ms 220 ms 211 ms border3.ge3-0-bbnet2.den.pnap.net [216.52.40.71]
21 201 ms 210 ms 220 ms sun-1.border3.den.pnap.net [216.52.42.42]
22 210 ms 211 ms 220 ms flres.java.Sun.COM [192.18.97.71]
Rilevazione completata.
19
netstat
Visualizza statistiche su protocollo e connessioni di rete TCP/IP
Sintassi:
netstat [-a]
Opzioni:
-a Visualizza tutte le connessioni e le porte di ascolto
C:\>netstat
Connessioni attive
Proto Indirizzo locale
TCP host1:22
TCP host1:1408
Indirizzo remoto
host2
host3
Stato
ESTABLISHED
TIME_WAIT
20