09.11.2016 Views

Foundations of Python Network Programming 978-1-4302-3004-5

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

CHAPTER 5 ■ NETWORK DATA AND NETWORK ERRORS<br />

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br />

HOST = sys.argv.pop() if len(sys.argv) == 3 else '127.0.0.1'<br />

PORT = 1060<br />

format = struct.Struct('!I') # for messages up to 2**32 - 1 in length<br />

def recvall(sock, length):<br />

» data = ''<br />

» while len(data) < length:<br />

» » more = sock.recv(length - len(data))<br />

» » if not more:<br />

» » » raise EOFError('socket closed %d bytes into a %d-byte message'<br />

» » » » » » % (len(data), length))<br />

» » data += more<br />

» return data<br />

def get(sock):<br />

» lendata = recvall(sock, format.size)<br />

» (length,) = format.unpack(lendata)<br />

» return recvall(sock, length)<br />

def put(sock, message):<br />

» sock.send(format.pack(len(message)) + message)<br />

if sys.argv[1:] == ['server']:<br />

» s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)<br />

» s.bind((HOST, PORT))<br />

» s.listen(1)<br />

» print 'Listening at', s.getsockname()<br />

» sc, sockname = s.accept()<br />

» print 'Accepted connection from', sockname<br />

» sc.shutdown(socket.SHUT_WR)<br />

» while True:<br />

» » message = get(sc)<br />

» » if not message:<br />

» » » break<br />

» » print 'Message says:', repr(message)<br />

» sc.close()<br />

» s.close()<br />

elif sys.argv[1:] == ['client']:<br />

» s.connect((HOST, PORT))<br />

» s.shutdown(socket.SHUT_RD)<br />

» put(s, 'Beautiful is better than ugly.')<br />

» put(s, 'Explicit is better than implicit.')<br />

» put(s, 'Simple is better than complex.')<br />

» put(s, '')<br />

» s.close()<br />

else:<br />

» print >>sys.stderr, 'usage: streamer.py server|client [host]'<br />

Note how careful we have to be! Even though four bytes <strong>of</strong> length is such a tiny amount <strong>of</strong> data that<br />

we cannot imagine recv() not returning it all at once, our code is still correct only if we carefully wrap<br />

78

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!