python 之 網絡編程(基於UDP協議的套接字通訊)

8.5 基於UDP協議的套接字通訊

UDP協議:數據報協議 特色:無鏈接,一發對應一收,先啓動哪一端都不會報錯 優勢:發送效率高,但有效傳輸的數據量最多爲500bytes服務器

缺點:不可靠:發送數據,無需確認,容易丟包網絡

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()                      # 關閉客戶套接字

8.6 客戶端與服務端操做( 基於UDP )

服務端: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'))

8.7 數據報協議沒有粘包問題

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))
相關文章
相關標籤/搜索