服務器
缺點:不可靠:發送數據,無需確認,容易丟包網絡
udp服務端socket
1 ss = socket() #建立一個服務器的套接字 2 ss.bind() #綁定服務器套接字 3 inf_loop: #服務器無限循環 4 cs = ss.recvfrom()/ss.sendto() # 對話(接收與發送) 5 ss.close() # 關閉服務器套接字
udp客戶端oop
cs = socket() # 建立客戶套接字 comm_loop: # 通信循環 cs.sendto()/cs.recvfrom() # 對話(發送/接收) cs.close() # 關閉客戶套接字
服務端:spa
import socket #地址家族,基於網絡 # 數據報協議 server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) server.bind(('127.0.0.1',8080)) #把地址綁定到套接字(0-65535) 0-1024給系統用的 while True: client_data,client_addr=server.recvfrom(1024)#收消息,1024是一個最大的限制 print(client_data.decode('utf-8')) msg=input('回覆%s:%s>>>:' %(client_addr[0],client_addr[1])) server.sendto(msg.encode('utf-8'),client_addr)
客戶端:code
import socket client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 數據報協議 while True: msg=input('>>>: ').strip() client.sendto(msg.encode('utf-8'),('127.0.0.1',8080)) res,server_addr=client.recvfrom(1024) #收消息 print(res.decode('utf-8'))
udp的recvfrom是阻塞的,一個recvfrom(x)必須對惟一一個sendinto(y),收完了x個字節的數據就算完成,如果y>x數據就丟失,這意味着udp根本不會粘包,可是會丟數據,不可靠server
每一個UDP包中就有了消息頭(消息來源地址,端口等信息),這樣對於接收端來講,就容易進行區分處理了。 即面向消息的通訊是有消息保護邊界的。blog
服務端:ip
import socket server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 數據報協議 server.bind(('127.0.0.1',8080)) res1,client_addr=server.recvfrom(1) #b'h' print(res1) res2,client_addr=server.recvfrom(2) #b'wo' print(res2) res3,client_addr=server.recvfrom(3) #b'ego' print(res3)
客戶端:utf-8
import socket client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 數據報協議 client.sendto(b'hello',('127.0.0.1',8080)) client.sendto(b'world',('127.0.0.1',8080)) client.sendto(b'egon',('127.0.0.1',8080))