Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Strato Di Trasporto

Download as pdf or txt
Download as pdf or txt
You are on page 1of 13

Programmazione di rete

• Generalità sullo strato di trasporto


– TCP
– UDP
– Socket
• Programmazione TCP in Java
– EchoServer ed EchoClient
• Uso del multithreading nella programmazione
di rete
– ChatClient e ChatServer
– Esempio di Web server(?)
• Classi per l’uso del Web (?)

Strato di trasporto

16 bit ! 0 - 65535
0 - 1023 riservati (FTP, HTTP, …)

UDP (User Datagram Protocol): protocollo che invia


pacchetti senza alcuna garanzia. Non è orientato alla
connessione

TCP (Transmission Control Protocol): orientato alla


connessione. Garantisce un trasferimento affidabile

http://java.sun.com/docs/books/tutorial/networking/
Working with URLs

Protocol, Host Name, Filename, Port Number ,Reference

!"#$%&'()&*$+$*(,$!"#-./001233,,,4%&'()&*456'31&%(73.89
!"#$%&'()&*:(0,6;<$+$*(,$!"#-%&'()&*=$.>&'()&*4*(04/0').89
!"#$%&'()&*:(0,6;<?6006'$+$*(,$!"#-%&'()&*:(0,6;<=
.@?ABBAC.89
!"#$%&'()&*$+$*(,$!"#-./001.=$.,,,4%&'()&*456'.=$DE=$$$$$$$
try {
.1&%(73>&'()&*4*(0,6;<4/0').89
URL myURL = new URL(. . .)
} catch (MalformedURLException e)
{
. . .
// exception handler code here
. . .
}

protocol = http

Parsing a URL host = java.sun.com


filename = /docs/books/tutorial/index.html
port = 80
ref = DOWNLOADING
import java.net.*;
import java.io.*;
public class ParseURL {
public static void main(String[] args) throws
Exception {
URL aURL = new URL("http://java.sun.com:80/docs/books/"
+ "tutorial/index.html#DOWNLOADING");
System.out.println("protocol = " + aURL.getProtocol());
System.out.println("host = " + aURL.getHost());
System.out.println("filename = " + aURL.getFile());
System.out.println("port = " + aURL.getPort());
System.out.println("ref = " + aURL.getRef()); }
}
<html>

Reading a URL <head>


<META HTTP-EQUIV="content-type"
CONTENT="text/html; charset=ISO-8859-1">
...
import java.net.*;
import java.io.*;
public class URLReader {
public static void main(String[] args) throws Exception
{
URL yahoo = new URL("http://www.google.com/");
BufferedReader in = new BufferedReader( new
InputStreamReader( yahoo.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}

URLconnection: Reading a
URL
import java.net.*;
import java.io.*;
public class URLConnectionReader {
public static void main(String[] args) throws Exception {
URL yahoo = new URL("http://www.yahoo.com/");
URLConnection yc = yahoo.openConnection();
BufferedReader in = new BufferedReader( new
InputStreamReader( yc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close(); }
}

The following program performs the same function as the !"#"(&F(; program
You can use the URLConnection object for other tasks (like writing to the URL) at the same time.
Reading from and Writing
to a URLConnection (1/2)
import java.io.*;
import java.net.*;
public class Reverse { public static void main(String[] args)
throws Exception {
if (args.length != 1) {
System.err.println("Usage: java Reverse " +
"string_to_reverse");
System.exit(1);
}
String stringToReverse = URLEncoder.encode(args[0]); 1. Create a URL
URL url = new URL("http://java.sun.com/cgi-bin/backwards");
URLConnection connection = url.openConnection(); 2. Open a connection to
the !"#
connection.setDoOutput(true); 3. N(0$6G01G0$5&1&KI)I0U$6*
0/($!"#T6**(50I6*

Reading from and Writing


to a URLConnection (2/2)
4. >(0$&*$6G01G0$70;(&'$H;6'$0/($56**(50I6*4$B/I7$6G01G0$70;(&'$I7$56**(50(F$06$0/(
70&*F&;F$I*1G0$70;(&'$6H$0/($5%IJKI*$75;I10$6*$0/($7(;L(;4
MH$0/($!"#$F6(7$*60$7G116;0$6G01G0=$%(0AG01G0N0;(&'$'(0/6F$!
!*<*6,*N(;LI5(OP5(10I6*

PrintWriter out = new PrintWriter( connection.getOutputStream());


out.println("string=" + stringToReverse); Q4$R;I0($06$0/($6G01G0
70;(&'4
out.close(); S4$T)67($0/($6G01G0$70;(&'4
BufferedReader in = new BufferedReader( new InputStreamReader(
connection.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine); in.close(); } Reverse Me

} reversed is:
eM esreveR
Socket

Socket: interfaccia locale a un host, creata e gestita a livello


applicativo, sotto il controllo del S.O.
Una “porta”, attraverso la quale un’applicazione può
inviare/ricevere messaggi a/da un’applicazione locale o remota

Socket/2
• Classe Socket:
– Implementa la parte client dei socket TCP
– Mette a disposizione del client due stream da/verso
un’applicazione sulla macchina locale o su una remota
– Ovviamente richiede che l’applicazione server sia in ascolto
• Classe ServerSocket:
– Implementa la parte server dei socket TCP
– Permette all’applicazione server di attendere richieste dei
client su una porta
– Mette a disposizione del server due strem da/verso
l’applicazione client
Attenzione: lo stream “out” del client corrisponde allo stream
“in” del server e viceversa
Funzionamento generale
1. Apertura della connessione
– Lato client -> Socket: per aprire una connessione verso un
server in ascolto
– Lato server -> ServerSocket: per mettersi in ascolto di
richieste di connessione
2. Dialogo per mezzo della connessione
– Uso di InputStream per ricevere dati
– Uso di OutputStream per inviare dati
– Stream “attaccati” al socket
3. Chiusura
– InputStream
– OutputStream
– Socket

Scrittura/lettura su Socket (1/3)


import java.io.*;
import java.net.*;
public class TCPEchoClient { public static void main(String[] args)
throws IOException {
Socket echoSocket = null;
PrintWriter out = null;
BufferedReader in = null;
try {
echoSocket = new Socket("taranis", 4444); 1. Apertura Socket
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
echoSocket.getInputStream()));
}
2. Apertura input/output stream da/verso
il socket.
Scrittura/lettura su Socket (2/3)

3. Gestione delle eccezioni

catch (UnknownHostException e) {
System.err.println("Don't know about host: taranis.");
System.exit(1);
}
catch (IOException e) {
System.err.println("Couldn't get I/O for " + "the
connection to: taranis.");
System.exit(1);
}

Scrittura/lettura su Socket (3/3)

BufferedReader stdIn = new BufferedReader( new


InputStreamReader(System.in));
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("echo: " + in.readLine());
} 4. Loop: legge una riga alla volta da stdin e la
manda al server scrivendola sullo stream
out.close();
PrintWriter connesso al socket.
5. Chiudi gli Stream
in.close();
stdIn.close();
6. Close Sockets
echoSocket.close();
}
}
Classe PrintWriter
• Classe PrintWriter: mette a disposizione metodi potenti
per output formattato
• Costruttori:
– public PrintWriter(OutputStream out,
boolean autoFlush)
• Metodi principali:
– void print(double d): determina la stringa
corrispondente a d e la traduce in byte secondo la
rappresentazione della piattaforma
– ..........
– void println(double d): come print(), ma aggiunge un
separatore di riga alla stringa
– ..........
• In pratica, per scrivere/leggere stringhe si usano
PrintWriter/BufferedWriter
• Per scrivere/leggere altri dati si ha una scelta più ampia

Classe Socket - costruttori

http://java.sun.com/products/jdk/1.2/docs/api/inde
x.html
Classe Socket - metodi

Classe Socket – metodi/2


Server Echo
import java.net.*;
import java.io.*;
public class TCPEchoServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null; V4$A%%(006$N(;L(;N65<(0
ascolta sulla porta specificata
try {
serverSocket = new ServerSocket(4444); W4$#&$16;0&$*6*$F(L(
(77(;($%IX$F(FI5&0&$&$G*
} catch (IOException e) { &)0;6$7(;LIYI6
System.err.println("Could not listen on port: 4444.");
System.exit(1); }
Z4$T6**(77I6*($70&KI)I0&2
Socket clientSocket = null; &55(10$;(70I0GI75($G*
*G6L6$6%%(006$N65<(0
try { ATTESA ! 5/($1GX$(77(;($G7&06$F&)
clientSocket = serverSocket.accept(); 7(;L(;$1(;$56'G*I5&;(
56*$I)$5)I(*0=$'(*0;(
} catch (IOException e) { )[6%%(006$N(;L(;N65<(0
X$G7&06$1(;$56*0I*G&;($&F
System.err.println("Accept failed."); &756)0&;($7G))&$16;0&
70&KI)I0&
System.exit(1); }

Server Echo/2
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),
true);
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
out.println(inputLine);
if (inputLine.equals("Bye."))
break;
}
out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
}
Interazione client - server
Server (su hostid) Client
Crea socket,
porta=x, per richieste
In arrivo:
serverSocket =
ServerSocket()

TCP Crea socket,


Attendi richiesta
di connessione connection setup connetti a hostid, porta=x
clientSocket = echoSocket =
serverSocket.accept() Socket()

Invia richiesta usando


Leggi stringa da echoSocket
clientSocket

Scrivi risposta su
clientSocket Leggi risposta da
Bye. echoSocket
Chiudi
clientSocket Chiudi
echoSocket

Funzionamento generale
1. Apertura della connessione
– Lato client -> Socket: per aprire una connessione verso un
server in ascolto
– Lato server -> ServerSocket: per mettersi in ascolto di
richieste di connessione
2. Dialogo per mezzo della connessione
– Uso di InputStream per ricevere dati
– Uso di OutputStream per inviare dati
– Stream “attaccati” al socket
3. Chiusura
– InputStream
– OutputStream
– Socket
Estensioni
1. Modificare il server in modo che rimanga sempre in ascolto
2. Scrivere il client e il server che implementino il seguente
protocollo:
1. Server in attesa sulla porta 4444
2. Il client invia la stringa: “To upper case request”
3. Il server risponde con la stringa “To upper case request accepted”
4. Il client invia stringhe che il server restituisce dopo aver applicato
il metodo toUpperCase()
5. Se il server riceve la stringa “Bye.” allora risponde a sua volta con
“Bye”
6. A questo punto server e client possono chiudere la connessione
(il client solo dopo aver ricevuto a sua volta la stringa “Bye” dal
server)
Nota: il server rimane in ascolto di nuove connessioni

A simple Web Server (1/3)


import java.net.*;
import java.io.*;
public class SimpleWebServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(4444);
} catch (IOException e) {
System.err.println("Could not listen on port:
4444.");
System.exit(1);
}
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.err.println("Accept failed.");
System.exit(1);
}

PrintWriter out = new


PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream()));
String inputLine;

while ((inputLine = in.readLine()) != null) {


System.out.println(inputLine);
if (inputLine.equals("Connection: Keep-Alive")) break;
}
String message = new String(args[0]);

out.println("HTTP/1.1 200 ok\r\n");


out.println("<html> \r\n"); out.println("<head> \r\n");
out.println("<title> index </title>\r\n");
out.println("</head> \r\n"); out.println("<body> \r\n");
out.println("<p><b>"+message+"</b></p> \r\n");
out.println("</body> \r\n"); out.println("</html> \r\n");
out.close();in.close();
clientSocket.close();serverSocket.close();
}
}

You might also like