Programmare con le Socket Corso Reti ed Applicazioni Lab Sockets pag. 1
Programmare con le Socket TCP Il Client deve contattare il server - Il processo server deve già essere attivo - Il server deve aver creato una socket che accetta la connessione del client ( socket di benvenuto ) Il Client: - Crea una socket TCP locale - Specifica l indirizzo IP e numero di porta del processo server - Quando il client crea la socket: il lato client TCP stabilisce una connessione con il server TCP Lab Sockets pag. 2
Programmare con le Socket TCP Quando viene contattato dal client, il server TCP crea una nuova socket per far comunicare il processo server con il client - Un server può interagire con molti client contemporaneamente - Il numero di porta sorgente è usato per distinguere diversi client Dal punto di vista dell applicazione TCP fornisce un trasferimento di byte (un tubo ) affidabile e ordinato tra client e server Dopo che è stata stabilita la connessione, le socket usate dal client e dal server sono equivalenti Lab Sockets pag. 3
Gli Stream - gergo - Uno stream (flusso) è una sequenza di caratteri che fluisce verso un processo o da un processo - Un input stream è collegato a qualche sorgente di input del processo, come la tastiera, un file o una socket. - Un output stream è collegato a qualche destinazione di output, come il monitor, un file o una socket. Lab Sockets pag. 4
Quando due processi hanno stabilito una connessione TCP usando le socket, l input stream della socket nel processo A è collegato all output stream della socket corrispondente nel processo B, e viceversa Processo A Gli Stream delle socket TCP Processo B input stream output stream infromb outtob Socket Socket outtoa infroma output input stream TCP socket TCP socket stream Lab Sockets pag. 5
Programmazione con le socket TCP Esempio di applicazione clientserver: 1) Il client legge una riga dallo reads standard input (stream infromuser), e la manda al server usando la socket (stream outtoserver ) 2) Il server legge la riga dalla socket 3) Il server converte la riga in caratteri maiuscoli, e la rimanda indietro al client 4) Il client legge dalla socket (stream infromserver ) la riga modificata, e la stampa Process Client process input stream output stream keyboard infromuser outtoserver monitor infromserver client TCP clientsocket socket input stream TCP socket to network from network Lab Sockets pag. 6
Interazione Client/server con le socket : TCP Server (in esecuzione su hostid) Crea una socket, port=x, per le richieste in arrivo: welcomesocket = ServerSocket(x) Attende richieste di connessione in ingresso connectionsocket = welcomesocket.accept() Legge la richiesta da connectionsocket Scrive la risposta su connectionsocket chiude connectionsocket TCP connection setup Client Crea una socket, Connessa a hostid, port=x clientsocket = Socket(hostid, port) Invia la richiesta usando clientsocket Legge la risposta da clientsocket chiude clientsocket Lab Sockets pag. 7
Esempio: Java client (TCP) import java.io.*; import java.net.*; class TCPClient { Crea un input stream Crea la socket client, Connessa al server Crea un output stream Connesso alla socket public static void main(string argv[]) throws Exception { String sentence; String modifiedsentence; BufferedReader infromuser = new BufferedReader(new InputStreamReader(System.in)); Socket clientsocket = new Socket("hostname", 6789); DataOutputStream outtoserver = new DataOutputStream(clientSocket.getOutputStream()); Lab Sockets pag. 8
Esempio: Java client (TCP), cont. Crea un input stream Connesso alla socket Manda una riga al server Legge una riga dal server BufferedReader infromserver = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); sentence = infromuser.readline(); outtoserver.writebytes(sentence + '\n'); modifiedsentence = infromserver.readline(); System.out.println("FROM SERVER: " + modifiedsentence); clientsocket.close(); Lab Sockets pag. 9
Esempio: Java server (TCP) import java.io.*; import java.net.*; class TCPServer { Crea una socket di benvenuto Sulla porta 6789 Aspetta sulla socket di benvenuto il contatto del client Crea un input stream, connesso alla socket public static void main(string argv[]) throws Exception { String clientsentence; String capitalizedsentence; ServerSocket welcomesocket = new ServerSocket(6789); while(true) { Socket connectionsocket = welcomesocket.accept(); BufferedReader infromclient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); Lab Sockets pag. 10
Esempio: Java server (TCP), cont Crea un output stream, connesso alla socket Legge una riga dalla socket Scrive una riga sulla socket DataOutputStream outtoclient = new DataOutputStream(connectionSocket.getOutputStream()); clientsentence = infromclient.readline(); capitalizedsentence = clientsentence.touppercase() + '\n'; outtoclient.writebytes(capitalizedsentence); Fine del loop while Torna all inizio in attesa di una nuova connessione Lab Sockets pag. 11
Programmazione con le socket UDP UDP: non c è connessione tra client e server - Non è necessario stabilire la connessione - Il mittente inserisce esplicitamente l indirizzo IP e la porta della destinazione in ogni pacchetto - Il server deve estrarre l indirizzo IP e la porta del mittente dal pacchetto ricevuto Punto di vista dell applicazione: - UDP fornisce un trasferimento non affidabile di gruppi di byte ( datagrammi ) tra client e server UDP: i dati ricevuti possono essere persi o ricevuti fuori ordine Lab Sockets pag. 12
Interazione Client/server con le socket: UDP Server (in esecuzione su hostid) Client Crea una socket, port=x, per le richieste in arrivo: serversocket = DatagramSocket(x) Legge le richieste da serversocket Scrive le risposte su serversocket Specificando indirizzo IP e porta del client Crea una socket, clientsocket = DatagramSocket() Crea, indirizza (hostid, port=x) Invia il datagramma di richiesta usando clientsocket Legge la risposta da clientsocket chiude clientsocket Lab Sockets pag. 13
Esempio: Java client (UDP) keyboard monitor Process Client process Output: invia un pacchetto (TCP mandava un flusso di byte ) input stream UDP packet infromuser sendpacket receivepacket client UDP clientsocket socket UDP packet UDP socket Input: riceve un pacchetto (TCP riceveva un flusso di byte ) to network from network Lab Sockets pag. 14
Esempio: Java client (UDP) import java.io.*; import java.net.*; Crea un input stream Crea la client socket Traduce hostname in un indirizzo IP usando il DNS class UDPClient { public static void main(string args[]) throws Exception { 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(); Lab Sockets pag. 15
Esempio : Java client (UDP), cont. Crea un datagramma con i dati, lunghezza, indirizzo IP, porta Invia il datagramma to server Legge il datagramma dal server DatagramPacket sendpacket = new DatagramPacket(sendData, senddata.length, IPAddress, 9876); clientsocket.send(sendpacket); DatagramPacket receivepacket = new DatagramPacket(receiveData, receivedata.length); clientsocket.receive(receivepacket); String modifiedsentence = new String(receivePacket.getData()); System.out.println("FROM SERVER:" + modifiedsentence); clientsocket.close(); Lab Sockets pag. 16
Esempio : Java server (UDP) import java.io.*; import java.net.*; Crea una socket datagramma Sulla porta 9876 Crea spazio per il datagramma ricevuto Rieceve il datagramma class UDPServer { public static void main(string args[]) throws Exception { DatagramSocket serversocket = new DatagramSocket(9876); byte[] receivedata = new byte[1024]; byte[] senddata = new byte[1024]; while(true) { DatagramPacket receivepacket = new DatagramPacket(receiveData, receivedata.length); serversocket.receive(receivepacket); Lab Sockets pag. 17
Esempio : Java server (UDP), cont Determina indirizzo IP e porta del mittente String sentence = new String(receivePacket.getData()); InetAddress IPAddress = receivepacket.getaddress(); int port = receivepacket.getport(); Crea un datagramma da mandare al client Scrive il datagramma Sulla socket String capitalizedsentence = sentence.touppercase(); senddata = capitalizedsentence.getbytes(); DatagramPacket sendpacket = new DatagramPacket(sendData, senddata.length, IPAddress, port); serversocket.send(sendpacket); Fine del loop while torna all inizio e attendi un altro datagramma Lab Sockets pag. 18