Lezione 7 – Socket Java Sistemi di elaborazione dell’informazione Modulo 4 - Tecniche di programmazione distribuita Unità didattica 1 - Socket library Ernesto Damiani Altre funzioni utili • bzero(char* c, int n) Numero di byte nulli che iniziano in c. • gethostname(char *name, int len) Trova il nome dell’host corrente. • gethostbyaddr(char *addr, int len, int type) Converte il nome di host IP in struttura contenente un numero intero lungo. • inet_addr(const char *cp) Converte stringhe di caratteri decimali puntati in interi lunghi. • inet_ntoa(const struct in_addr in) Converte long in notazione decimale puntata. Porte libere • Talvolta se accade un’uscita “rude” da un programma (Ctrl-c), il sistema operativo non libera immediatamente la porta. • Alla fine, dopo alcuni minuti, la porta verrà liberata. • Per ridurre le probabilità che si verifichi questo problema, bisogna inserire il seguente codice: – #include <signal.h> – void cleanExit(){exit(0);} – nel codice che usa il socket: signal(SIGTERM, cleanExit); signal(SIGINT, cleanExit); Socket Java Il pacchetto .net di Java fornisce due classi: • Socket: per implementare un client; • ServerSocket: per implementare un server. Implementazione di un server (1) 1. Aprire il socket server : – ServerSocket server; – DataOutputStream os; – DataInputStream is; – Server = new ServerSocket( PORT ); 2. Aspettare la richiesta del client (Client Request): – Socket client = server.accept(); 3. Creare flussi I/O per comunicare con il client: • is = new DataInputStream( client.getInputStream() ); • os = new DataOutputStream( client.getOutputStream() ); Implementazione di un server (2) 4. Eseguire la comunicazione con il client: – ricevere i dati dal client: String line = is.readLine(); – inviare i dati al client: os.writeBytes(“Hello\n”); 5. Alla fine chiudere il socket: – client.close(); Per server multithread: • while (true) – aspettare le richieste del client (v. fase 2); – creare un thread con socket “client” come parametro. Il thread crea flussi (v. fase 3) ed esegue la comunicazione (v. fase 4); – fornito il servizio eliminare il thread. Implementazione di un client 1. Creare un oggetto socket: – client = new Socket ( server, port_id ); 2. Creare flussi I/O per comunicare con il server: – is = new DataInputStream( client.getInputStream() ); – os = new DataOutputStream( client.getOutputStream() ); 3. Eseguire I/O o la comunicazione con il server: – ricevere dati dal server: String line = is.readLine(); – inviare i dati al server: os.writeBytes(“Hello\n”); 4. Alla fine chiudere il socket: – client.close(); FINE