|
最近学习python,在《python网络编程》这本书中第二章2-1例子:使用自环接口的UDP服务器和客户端有点困惑
- #!/usr/bin/env python3
- # Foundations of Python Network Programming,Third Edition
- # UDP client and server on localhost
- import argparse,socket
- from datetime import datetime
- MAX_BYTES = 65535
- def server(port):
- sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- sock.bind(('127.0.0.11',port))
- print('Listening at {}',format((sock.getsockname())))
- while True:
- data,address = sock.recvfrom(MAX_BYTES)
- text = data.decode('ascii')
- print('The client at {} says {!r}'.format(address,text))
- text = 'Your data was {} bytes long '.format(len(data))
- data = text.encode('ascii')
- sock.sendto(data,address)
-
- def dlient(port):
- sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- text = 'The time is {}'.format(datetime.now())
- data = text.encode('ascii')
- sock.sendto('127.0.0.1',port)
- print('The os assigned me the address {}'.format(sock.getsockname()))
- data,address = sock.recvfrom(MAX_BYTES)#Danger!
- text = data.decode('ascii')
- print('The server {} replied (!r)'.format(address,port))
-
-
- if __name__ == '__main__':
- choices = {'client': client ,'server': server} #
- parser = argparse.ArgumentParser(description ='Send and receive UDP locally')
- parser.add_argument('role',choices=choices,help ='Which role to play')
- 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.p)
复制代码 提示D:\py\python_test\UDP_CS>python udp_local.py client
Traceback (most recent call last):
File "udp_local.py", line 34, in <module>
choices = {'client':client, 'server':server}
NameError: name 'client' is not defined
但是一直没找到原因 ,书上的例子中并没有对字典中的键值进行定义。如果把值得类型改为str的在functin(args.p)中会提示无法调用str类型,请问是代码有缺漏还是缩进哪里有不对。
|
|