Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
1
Corso di Reti di Calcolatori Programmazione Java
3. Socket TCP e UDP 4. Sviluppare un webserver 20/12/2002 ing. G. Lo Presti
2
Interfacce: esempio d’uso
Abbiamo visto l’interfaccia Runnable, che useremo per gestire il multithreading: class MyRun implements Runnable { public void run( ) { …… // method implementation } …… Thread threadB = new Thread(new MyRun()); threadB.start( ); Thread target Runnable Thread constructor Object instance of MyRun class run() MyRun run() …come funziona il metodo start( ) ? ing. G. Lo Presti
3
Interfacce: esempio d’uso
Questa è la pseudocodifica della classe Thread: public class Thread { Runnable target; public Thread(Runnable target) { this.target = target; } public void start( ) { create a thread; asynchronously execute target.run( ); immediately return; Siamo certi che questa chiamata venga correttamente eseguita perché target deve contenere un metodo run( ). Object Object Se target fosse di qualunque altro tipo (ad es. Object), il compilatore non riuscirebbe a trovare il metodo run( ) neanche se fosse effettivamente presente. ing. G. Lo Presti
4
I Socket (richiami) socket
Le socket API consentono alle applicazioni di comunicare con altri processi Approccio Client/Server Un socket viene identificato dalla quintupla: (protocol, clientIP, clientPort, serverIP, serverPort) Il protocollo di trasporto può essere TCP o UDP TCP: reliable, in-order transfer of byte (“pipe”) between client and server UDP: unreliable transfer of group of bytes (“datagrams”) between client and server A host-local, application-created/owned, OS-controlled interface (a “door”) into which application process can both send and receive messages to/from another (remote or local) application process socket ing. G. Lo Presti
5
Client/server socket interaction: TCP
Server (running on hostname) Client create socket, port=x, for incoming request: welcomeSocket = ServerSocket(x) TCP connection setup close connectionSocket read reply from clientSocket create socket, connect to hostname, port=x clientSocket = Socket(host, x) wait for incoming connection request connectionSocket = welcomeSocket.accept() send request using clientSocket read request from connectionSocket write reply to ing. G. Lo Presti
6
Esempio: TCP server class TCPServer {
public static void main(String argv[]) { String clientSentence, capitalizedSentence; try { ServerSocket welcomeSocket = new ServerSocket(6789); } catch (IOException ioe) { System.err.println(“Could not listen on port 6789.”); } while(true) try { Socket connectionSocket = welcomeSocket.accept(); // bloccante! BufferedReader inFromClient = new BufferedReader( new InputStreamReader(connectionSocket.getInputStream())); DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); clientSentence = inFromClient.readLine(); // bloccante capitalizedSentence = clientSentence.toUpperCase() + '\n'; outToClient.writeBytes(capitalizedSentence); // connectionSocket.close(); non necessaria dato che viene fatto lato client } catch (IOException ioe) { System.err.println(“I/O error: ”+ ioe); } catch (Exception e) { System.err.println(“Other error: ”+ e); e.printStackTrace(); } } ing. G. Lo Presti
7
Esempio: TCP client class TCPClient {
public static void main(String argv[]) { String sentence, modifiedSentence; try { BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); Socket clientSocket = new Socket(“hostname”, 6789); DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); sentence = inFromUser.readLine(); // bloccante outToServer.writeBytes(sentence + '\n'); modifiedSentence = inFromServer.readLine(); // bloccante System.out.println("FROM SERVER: " + modifiedSentence); clientSocket.close(); } catch (IOException ioe) { System.err.println(“I/O error: ”+ ioe); } catch (Exception e) { System.err.println(“Other error: ”+ e); e.printStackTrace(); } } ing. G. Lo Presti
8
Client/server socket interaction: UDP
Server (running on hostname) create socket, clientSocket = DatagramSocket() Client Create, address=hostname, port=x, send datagram request using clientSocket create socket, port=x, for incoming request: serverSocket = DatagramSocket(x) read request from serverSocket close clientSocket read reply from clientSocket write reply to serverSocket specifying client host address, port number ing. G. Lo Presti
9
Esempio: UDP server class UDPServer {
public static void main(String args[]) { try { DatagramSocket serverSocket = new DatagramSocket(9876); } catch (IOException ioe) { System.err.println(“Could not listen on port 9876.”); } byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024]; while(true) try { DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); serverSocket.receive(receivePacket); // bloccante String sentence = new String(receivePacket.getData()); InetAddress IPAddress = receivePacket.getAddress(); // ricava dal pacchetto in arrivo int port = receivePacket.getPort(); // le informazioni per rispondere String capitalizedSentence = sentence.toUpperCase(); sendData = capitalizedSentence.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); serverSocket.send(sendPacket); } catch (IOException ioe) { System.err.println(“I/O error: ”+ ioe); } catch (Exception e) { System.err.println(“Other error: ”+ e); e.printStackTrace(); } } ing. G. Lo Presti
10
Esempio: UDP client class UDPClient {
public static void main(String args[]) { try { BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); DatagramSocket clientSocket = new DatagramSocket(); InetAddress IPAddress = InetAddress.getByName("hostname"); byte[] sendData = new byte[1024]; byte[] receiveData = new byte[1024]; String sentence = inFromUser.readLine(); sendData = sentence.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876); clientSocket.send(sendPacket); DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket); // bloccante String modifiedSentence = new String(receivePacket.getData()); System.out.println("FROM SERVER: " + modifiedSentence); clientSocket.close(); // obbligatorio chiudere il socket anche se UDP è connectionless } catch (IOException ioe) { System.err.println(“I/O error: ”+ ioe); } catch (Exception e) { System.err.println(“Other error: ”+ e); e.printStackTrace(); } } ing. G. Lo Presti
11
Il protocollo HTTP (richiami)
Protocollo stateless basato su TCP (porta 80) 2 tipi di messaggi HTTP: request, response formato: ASCII in chiaro HTTP request message: request line (GET, POST, HEAD commands) GET /somedir/page.html HTTP/1.1 User-agent: Mozilla/4.0 Accept: text/html, image/gif,image/jpeg Accept-language:it (extra carriage return, line feed) header lines Carriage return, line feed indicates end of message ing. G. Lo Presti
12
Il protocollo HTTP (richiami)
HTTP response message: status line (protocol status code status phrase) HTTP/ OK Date: Thu, 06 Aug :00:15 GMT Server: Apache/1.3.0 (Unix) Last-Modified: Mon, 22 Jun Content-Length: 6821 Content-Type: text/html data data data data data ... header lines data, e.g. requested html file ing. G. Lo Presti
13
Un semplice webserver Obiettivo: sviluppare un semplice webserver con le seguenti specifiche: HTTP 1.0 compliant; stare in ascolto sulla porta TCP 8080; soddisfare le richieste di tipo HEAD e di tipo GET, quest’ultima con una pagina HTML standard creata al volo (non gestire file); gestire eventuali eccezioni senza terminare il demone in ascolto; gestire un client alla volta (mono thread); ing. G. Lo Presti
14
Il linguaggio HTML Hyper-Text Markup Language
Linguaggio per la descrizione di documenti Payload del protocollo HTTP Organizzato a tag, con una struttura ad albero il tag è l’elemento informativo elementare e può contenere attributi es. <a href=‘ i tag si possono nidificare es. <p><font face=‘Helvetica’>Paragrafo di testo</font></p> Riferimenti: Sviluppi recenti: XML ing. G. Lo Presti
15
Un semplice webserver Package per gestire connessioni di rete e I/O
import java.net.*; import java.io.*; public class SimpleWebServer { public static void main(String[] args) { ServerSocket serverSocket = null; int reqCount = 1; try { serverSocket = new ServerSocket(8080); } catch (IOException e) { System.err.println("Could not listen on port 8080."); System.exit(1); } System.out.println("Server started.” + “ Waiting for client connections...\n”); while (true) { Socket clientSocket = null; clientSocket = serverSocket.accept(); System.err.println("Accept failed."); continue; Package per gestire connessioni di rete e I/O Si mette in ascolto sulla porta 8080 Aspetta indefinitamente un client (browser) ing. G. Lo Presti
16
Un semplice webserver try { PrintWriter out = new PrintWriter( clientSocket.getOutputStream(), true); BufferedReader in = new BufferedReader( new InputStreamReader( clientSocket.getInputStream())); String inputLine; boolean doGet = false; System.out.println("*** Client request:"); while ((inputLine = in.readLine()) != null) { System.out.println(inputLine); if (inputLine.indexOf("GET") != -1) doGet = true; if (inputLine.length() == 0) break; } Alla connessione di un client vengono creati gli stream associati al socket: PrintWriter e BufferedReader (orientati ai caratteri) Viene letto l’intero comando di request: se è presente la parola chiave GET allora si tratta di una richiesta di tipo GET La lettura termina quando vengono rilevati due EOL consecutivi ing. G. Lo Presti
17
Un semplice webserver Prepara la pagina HTML da restituire
String data = "<html>\n<head><title>Simple WebServer”+ + " Test</title></head>\n" + "<body>\n<h2>Hello world!<br>This is the " + reqCount + "th request from startup.</h2>\n" + "</body></html>\n"; out.println("HTTP/ ok"); out.println("Date: " + (new java.util.Date())); out.println("Server: Simple java web server/1.0"); out.println("Last-Modified: " + (new java.util.Date())); if (doGet) out.println("Content-Length: " + data.length()); out.println("Content-Type: text/html"); out.println(); System.out.println("\tHeader sent"); if (doGet) { out.println(data); System.out.println("\tData sent"); } System.out.println(); Prepara la pagina HTML da restituire Inizia l’invio del response HTTP verso il client: viene inviato l’header seguito da un EOL Se si tratta di un comando GET invia la pagina HTML, per qualunque altro comando invia solo l’header. ing. G. Lo Presti
18
Un semplice webserver Chiude entrambi gli stream ed il socket verso il client Gestisce qualunque errore di I/O segnalandolo sulla console In ogni caso incrementa il contatore delle richieste effettuate e ricomincia ad aspettare un nuovo client. out.close(); in.close(); clientSocket.close(); } catch (IOException ioe) { System.err.println("I/O error: " + ioe); reqCount++; ing. G. Lo Presti
19
Webserver Test ing. G. Lo Presti
20
Riepilogo Socket in Java Esempio: un webserver Socket ServerSocket
DatagramSocket Esempio: un webserver HTTP monothread! come realizzare un server multithread? ing. G. Lo Presti
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.