/python3/05/blocks.py
https://bitbucket.org/brandon/foundations-of-python-network-programming/ · Python · 56 lines · 45 code · 8 blank · 3 comment · 9 complexity · 72f2211ed96dbd7fe0e401e21e5baf79 MD5 · raw file
- #!/usr/bin/env python
- # Foundations of Python Network Programming - Chapter 5 - blocks.py
- # Sending data one block at a time.
- import socket, struct, 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
- format = struct.Struct('!I') # for messages up to 2**32 - 1 in length
- def recvall(sock, length):
- data = b''
- 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 get(sock):
- lendata = recvall(sock, format.size)
- (length,) = format.unpack(lendata)
- return recvall(sock, length)
- def put(sock, message):
- sock.send(format.pack(len(message)) + message)
- if sys.argv[1:] == ['server']:
- s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- s.bind((HOST, PORT))
- s.listen(1)
- print('Listening at', s.getsockname())
- sc, sockname = s.accept()
- print('Accepted connection from', sockname)
- sc.shutdown(socket.SHUT_WR)
- while True:
- message = get(sc)
- if not message:
- break
- print('Message says:', repr(message))
- sc.close()
- s.close()
- elif sys.argv[1:] == ['client']:
- s.connect((HOST, PORT))
- s.shutdown(socket.SHUT_RD)
- put(s, b'Beautiful is better than ugly.')
- put(s, b'Explicit is better than implicit.')
- put(s, b'Simple is better than complex.')
- put(s, b'')
- s.close()
- else:
- print('usage: streamer.py server|client [host]', file=sys.stderr)