Laboratorio (6 punti) Prova in itinere 1 - Esempio A Q1 Si consideri i seguenti codici Python per client e server. Il codice contiene un errore. Quale? Come lo si può correggere modificando il server? Client Name = 'ilmioserver.gratis' Port = 15001 Socket = socket(af_inet, SOCK_STREAM) Socket.connect((Name, Port)) for count in range(1,11): Socket.send('Ho una domanda') risposta = Socket.recv(1024) print 'From Server:', risposta Socket.send('.') Socket.close() Server sport = 15001 ssocket = socket(af_inet, SOCK_STREAM) ssocket.bind(('', sport)) ssocket.listen(1) csocket, clientaddress = ssocket.accept() domanda = csocket.recv(1024) if domanda == 'Ho una domanda': risposta = 'Non ho risposte' csocket.send(risposta) csocket.close() Il client invia per dieci volte la domanda ma il server chiude la connessione dopo aver inviato la prima risposta. Possibile modifica: sport = 15001 ssocket = socket(af_inet, SOCK_STREAM) ssocket.bind(('', sport)) ssocket.listen(1) csocket, clientaddress = ssocket.accept() domanda = csocket.recv(1024) if domanda == 'Ho una domanda': risposta = 'Non ho risposte' else: break csocket.send(risposta) csocket.close()
Q2 Si consideri il server in python scritto sotto. Vengono aperti in parallelo una dopo l altra 4 connessioni da client verso il server. Come vengono gestiti e cosa vedono i quattro client assumendo che ciascuno di essi cerchi di inviare prima una stringa xxx e poi, attendendo 10 s, una stringa.? sport = 15001 ssocket = socket(af_inet, SOCK_STREAM) ssocket.bind(('', sport)) ssocket.listen(2) client = 1 csocket, clientaddress = ssocket.accept() domanda = csocket.recv(1024) if domanda == '.': break risposta = '' for count in (0,client): risposta = risposta + domanda + ' ' csocket.send(risposta) cliente = client + 1 csocket.close() Il primo client viene servito subito e riceve una risposta uguale alla stringa inviata xxx e poi la connessione viene chiusa. Il secondo cliente viene servito dopo il primo e riceve come risposta due volte la stringa xxx xxx e poi la connessione viene chiusa. Il terzo cliente viene servito dopo il secondo e riceve come risposta tre volte la stringa xxx xxx xxx e poi la connessione viene chiusa. La connessione del quarto client viene rifiutata.
Laboratorio (6 punti) Prova in itinere 1 - Esempio B Q1 Si vuole scrivere un'applicazione client/server UDP per il calcolo dei quadrati. Il client chiede all'utente di inserire un numero, il server risponde con il quadrato del numero e infine il client stampa la risposta. (Hint! Utilizzare le funzioni int() e str(): int() converte una stringa ricevuta in un numero intero per effettuare operazioni aritmetiche, str() converte un intero in una stringa da trasmettere). Si completi il codice del server UDP client servername = 'localhost' clientsocket = socket(af_inet, SOCK_DGRAM) message = raw_input( Inserisci un numero ) clientsocket.sendto(message, (servername, serverport)) reply, serveraddress = clientsocket.recvfrom(2048) print reply clientsocket.close() UDP server serversocket = socket(af_inet, SOCK_DGRAM) serversocket.bind(('', serverport)) print "The server is ready to receive"...da COMPLETARE Possibile risposta while 1: message, clientaddress = serversocket.recvfrom(2048) print "Datagram from: ", clientaddress modifiedmessage = str(int(message)*int(message)) serversocket.sendto(modifiedmessage, clientaddress)
Q2 Data la seguente coppia di script si indichi: a) quale è il client e quale il server b) cosa fa l applicazione implementata Script A servername = 'localhost' clientsocket = socket(af_inet, SOCK_STREAM) clientsocket.connect((servername, serverport)) clientsocket.send( Ho vinto? ) reply = clientsocket.recv(1024) print 'From Server:', reply clientsocket.close() Script B serversocket = socket(af_inet, SOCK_STREAM) serversocket.bind(('', serverport)) serversocket.listen(1) print 'The server is ready to receive' client_num = 0 connectionsocket, clientaddress = serversocket.accept() client_num = client_num + 1 print "Connection from: ", clientaddress sentence = connectionsocket.recv(1024) if client_num == 1337: connectionsocket.send( Hai vinto! ) client_num = 0 else: connectionsocket.send( Ritenta! :( ) connectionsocket.close() a) Lo script A implementa il client, lo script B implementa il server b) Il client invia al server la stringa 'Ho vinto?', il server restituisce 'Hai vinto!' a un visitatore ogni 1337, altrimenti restituisce 'Ritenta! :('.
Laboratorio (6 punti) Prova in itinere 1 - Esempio C Q1 Il codice sottoriportato rappresenta una versione semplificata del videogioco Pokèmon GO. Periodicamente l applicazione dell utente (client) invia le proprie coordinate GPS al server, che risponde con l elenco dei Pokèmon presenti nelle vicinanze. Il diagramma in figura mostra il protocollo applicativo, in 3 fasi, tra Client e Server. Client Server FASE 1: Client invia al server le proprie coordinate GPS FASE 2: Il Server comunica al client il numero di Pokèmon nelle vicinanze FASE 3: Il Client richiede iterativamente al Server il nome dei Pokèmon nelle vicinanze Q1) Completare il codice mancante nel Server e nel Client per implementare la fase 3 del protocollo. Q2) Quanti utenti si possono accodare nel Server in attesa di essere serviti? La coda è di 5 utenti Q3) Che protocollo di trasporto è utilizzato? Perché la comunicazione tra server e client richiede tale protocollo? E utilizzato TCP. La modalità connection-oriented consente di mantenere memoria dello stato della connessione e inviare la lista corretta all utente che ha aperto la connessione. Inoltre, TCP garantisce la consegna dei messaggi
Script client servername = 'localhost' clsock = socket(af_inet, SOCK_STREAM) clsock.connect((servername, serverport)) # Invia coordinate GPS al server (latitudine,longitudine) = (5,10) clsock.send(str(latitudine)) message = clsock.recv(2) if message == 'OK': clsock.send(str(longitudin e)) # Legge dal server il numero di Pokemon nelle vicinanze da richiedere poi al server numero_pokemon = int( clsock.recv(100) ) lista_pokemon = [] # Richiede, uno alla volta, la lista dei pokemon al server for i in range(numero_pokemon): clsock.send('go') pokemon = clsock.recv(100) lista_pokemon.append( pokemon ) print lista_pokemon clsock.close() Script server servsock = socket(af_inet, SOCK_STREAM) servsock.bind(('', serverport)) servsock.listen(5) print 'Server Pokemon GO pronto!' clsock, claddr= servsock.accept() print "Connection form: ", claddr # Riceve dal client le coordinate GPS lat = int( clsock.recv(100) ) clsock.send("ok") long = int( clsock.recv(100) ) # Definisce la lista dei Pokemon lista_pkmn = ["Pikachu","Charmander"] # e ne invia la lunghezza clsock.send(str(len(lista_ pokemon))) for pokemon in lista_pkmn: message = clsock.recv(2) if message == 'GO': clsock.send(pokemon) clsock.close()