一、环境
windows10 + python3.6
二、code
#!/usr/bin/env python3# coding=utf-8import argparse, random, socket, sysMAX_BYTES = 65535def server(interface, port): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind((interface, port)) print('Listening at', sock.getsockname()) while True: data, address = sock.recvfrom(MAX_BYTES) if random.random() < 0.5: print('Pretending to drop packet from {}'.format(address)) continue text = data.decode('ascii') print('The client at {} says {!r}'.format(address, text)) message = 'You data was {} bytes long'.format(len(data)) sock.sendto(message.encode('ascii'), address)def client(hostname, port): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) hostname = sys.argv[2] sock.connect((hostname, port)) print('Client socket name is {}'.format(sock.getsockname())) delay = 0.1 # seconds text = 'This is another message' data = text.encode('ascii') while True: sock.send(data) print('Waiting up to {} seconds for a reply'.format(delay)) sock.settimeout(delay) try: data = sock.recv(MAX_BYTES) # recv() is block except socket.timeout: '''exponential backoff(指数退避)''' delay *= 2 # wait even longer for the next request if delay > 2.0: raise RuntimeError('I think the server is down') else: break # we are done, and can stop looping print('The server says {!r}'.format(data.decode('ascii')))if __name__ == '__main__': choices = {'client': client, 'server': server} parser = argparse.ArgumentParser(description='Send and receive UDP,' 'pretending packets are often dropped') parser.add_argument('role', choices=choices, help='Which role to take') parser.add_argument('host', help='interface the server listens at;' 'host the client sends to') parser.add_argument('-p', metavar='PORT', type=int, default=1060, help="UDP port (default 1060)") args = parser.parse_args() function = choices[args.role] function(args.host, args.p)
udp广播
#!/usr/bin/env python3# coding=utf-8import argparse, socketBUFSIZE = 65535def server(interface, port): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind((interface, port)) print('Listening for datagrams at {}'.format(sock.getsockname())) while True: data, address = sock.recvfrom(BUFSIZE) text = data.decode('ascii') print('The client at {} says: {!r}'.format(address, text))def client(network, port): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) text = 'Broadcast datagram!' sock.sendto(text.encode('ascii'), (network, port))if __name__ == '__main__': choices = {'client': client, 'server': server} parser = argparse.ArgumentParser(description='Send,receive UDP broadcast') parser.add_argument('role', choices=choices, help='wich role to take') parser.add_argument('host', help='interface the server listens at;' 'network the client sends to') parser.add_argument('-p', metavar='port', type=int, default=1060, help='UDP port (default 1060)') args = parser.parse_args() function = choices[args.role] function(args.host, args.p)