1. 程式人生 > >使用自環接口的UDP服務器和客戶端

使用自環接口的UDP服務器和客戶端

while clas code style client cal listen __main__ choices

 1 import argparse,socket
 2 from datetime import datetime
 3 
 4 MAX_BYTES = 65535
 5 
 6 def server(port):
 7     sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #協議族AF_INET以及數據報類型SOCK_DGRAM.SOCK_DGRAM表示在IP網絡上使用UDP協議
 8                                     #要註意的是數據報datagram而不是數據包packet,用了表示應用層數據塊傳輸的官方術語
9 sock.bind((127.0.0.1,port)) #綁定一個UDP網絡地址:一個二元組,包含一個IP地址和一個整形的UDP端口號 10 #端口號要大於1023,否則要管理員權限 11 print(Listening at {}.format(sock.getsockname())) #查詢套接字當前綁定的IP地址和端口號 12 while True: #會進入一個循環不斷運行recvfromO 13
data,adress = sock.recvfrom(MAX_BYTES) #最長可接收65535字節的信息,也是UDP數據報可包含的最大長度,沒有接收到永遠等待 14 #一旦接收到數據報,返回兩個值。1 發送該數據報的客戶端地址 2 以字節表示數據報的內容 15 text = data.decode(ascii) 16 print(The client at {} says {!r}.format(adress,text)) 17 text =
Your data was {} bytes long.format(len(data)) 18 data = text.encode(ascii) 19 sock.sendto(data,adress) 20 21 def client(port): 22 sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 23 text = The time is {}.format(datetime.now()) 24 data = text.encode(ascii) 25 sock.sendto(data,(127.0.0.1,port)) #兩個信息:要發送的信息和目標地址。這是向服務器發送數據報的唯一調用 26 print(The OS assigned me the adress {}.format(sock.getsockname())) 27 data,adress = sock.recvfrom(MAX_BYTES) 28 text = data.decode(asicc) 29 print(The serve {} replied {!r}.format(adress,text)) 30 if __name__ == __main__: 31 choices = {client:client,server:server} 32 parser = argparse.ArgmentParser(description=Send and receive UDP locally) 33 parser.add_argument(role,choices = choices ,help = which role to play) 34 parser.add_argument(-p,metavar = PORT,type = int ,default = 1060, 35 help = UDP port (default 1060)) 36 args = parser.parse_args() 37 function = choices[args.role] 38 function(args.p)

使用自環接口的UDP服務器和客戶端