#!/usr/bin/env python # TCP UPPER SERVER/CLIENT application # # TRACCIA DELL'ESERCIZIO # #CLIENT: il processo client legge da input una frase immessa dall'utente e la invia al server utilizzando un socket TCP. Dopo che la frase e' stata inviata, il processo client chiede all'utente di immettere una nuova frase, oppure di premere invio per terminare l'inserimento. In questo caso, il processo client comincia a leggere dal socket per ricevere la risposta dal server e, quando la riceve, la stampa a schermo. #SERVER: il processo server riceve tutte le frasi dall'utente e le concatena in una sola stringa. Quando ha ricevuto e concatenato tutte le frasi, trasforma la stringa in caratteri maiuscoli e la reinvia al client. import socket, sys s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) HOST = sys.argv.pop() if len(sys.argv) == 3 else '127.0.0.1' PORT = 1060 def recvall(sock, length): data = '' while len(data) < length: more = sock.recv(length - len(data)) if not more: raise EOFError('socket closed %d bytes into a %d-byte message' % (len(data), length)) data += more return data def readline(sock): data = '' char = '' while char != '\n': char = sock.recv(1) if not char: raise EOFError('socket closed %d bytes into a %d-byte message' % (len(data), length)) data += char return data[:-1] if sys.argv[1:] == ['server']: s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((HOST, PORT)) s.listen(1) while True: print 'Listening at', s.getsockname() sc, sockname = s.accept() print 'We have accepted a connection from', sockname print 'Socket connects', sc.getsockname(), 'and', sc.getpeername() try: data = '' size = 1 while True: size = readline(sc) size = int(size) if size != 0: chunk = recvall(sc, size) data += chunk print 'Chunk: "{0}"'.format(chunk) else: break print 'Received "%s". Sending data back to the client' % data sc.sendall(data.upper()) print 'Data sent!' except EOFError: print 'Client closed unexpectedly' finally: sc.close() print 'Socket closed' elif sys.argv[1:] == ['client']: s.connect((HOST, PORT)) print 'Client has been assigned socket name', s.getsockname() totalSize = 0 more = 'yes' while True: payload = raw_input('Please type a message (or type "Enter" to stop sending messages): ') if payload != '': totalSize += len(payload) message = str(len(payload)) + '\n'+ payload print message s.sendall(message) else: message = str(0) + '\n' s.sendall(message) break reply = recvall(s, totalSize) print 'The server said', repr(reply) s.close() else: print >>sys.stderr, 'usage: tcp_local.py server|client [host]'