基於udp協議的套接字及udp協議粘包問題

2022-06-30 16:18:13 字數 2989 閱讀 9814

udp協議的套接字

udp協議傳輸  服務端和客戶端沒有建立連線一說。

import

socket

#總結一下基礎工作流程:服務端生成套接字並繫結ip_port,進入資料傳輸迴圈,服務端接受客戶端傳送的資訊和位址,

#然後服務端對客戶端請求做出響應,傳送處理好的資料根據而客戶端位址。

#客戶端建立套接字,直接進入傳輸迴圈,根據服務端的ip_port給服務端傳送請求,接收資料返回處理的資料內容和服務端ip_port。

#客戶端 sendto(位元組 + 服務端ip_port) ——》服務端 recvfrom(1024)接收客戶端資料和ip_port——》服務端處理資料,sendto(處理好的資料,客戶端ip_port),

#——》客戶端接受服務端資料和ip_port recvfrom(1024)

server=socket.socket(socket.af_inet,socket.sock_dgram) #

資料報協議-》udp # 生成基於udp協議的套接字

server.bind(('

127.0.0.1

',8080)) #

繫結服務端ip_port

while

true:

data,client_addr=server.recvfrom(1024) #

接受客戶端資料內容和客戶端ip_port

print('

===>

',data,client_addr)

server.sendto(data.upper(),client_addr)

#傳送返回值給客戶端,sendto(資料處理,客戶端位址)

server.close()

udp傳輸服務端

import

socket

client=socket.socket(socket.af_inet,socket.sock_dgram) #

資料報協議-》udp 生成基於udp協議的套接字

while

true:

msg=input('

>>:

').strip() #

msg='' # 傳過去的是空字元,服務端也會有返回值b『』,因為基於udp協議是資料報協議傳輸,有報頭。

client.sendto(msg.encode('

utf-8

'),('

127.0.0.1

',8080)) #

sendto(位元組內容+ 服務端位址)

data,server_addr=client.recvfrom(1024) #

接收資料返回處理的資料內容和服務端ip_port

print

(data)

client.close()

udp傳輸客戶端

udp傳輸存在粘包問題

import

socket

#udp協議不存在粘包問題,只有資料丟失。一般用在資料訪問,qq也用的udp。

server=socket.socket(socket.af_inet,socket.sock_dgram) #

資料報協議-》udp(sock_dgram)

server.bind(('

127.0.0.1

',8080)) #

服務端還是需要繫結ip_port

data,client_addr=server.recvfrom(1) #

b'hello'==>b'h' 在windows下會直接報錯,unix和linux會接受1個位元組。

#這裡的recvfrom返回乙個元組,分別是資料和客戶端ip和埠

print('

第一次:

',client_addr,data)

data,client_addr=server.recvfrom(1024) #

b'world' =>b'world' # udp時傳送資料報,包含報頭和資料內容

#即使傳送空字元,他也會接受報頭,而不是還在等待接受。如果資料過大,udp協議傳輸會直接造成資料丟失,不可靠傳輸。

#print('

第二次:

',client_addr,data)##

data,client_addr=server.recvfrom(1024)

#print('第三次:',client_addr,data)

server.close()

udp粘包問題服務端

import

socket

client=socket.socket(socket.af_inet,socket.sock_dgram) #

資料報協議-》udp

client.sendto(

'hello

'.encode('

utf-8

'),('

127.0.0.1

',8080)) #

sendto 後面跟著傳送的位元組形式內容以及服務端ip_port

client.sendto('

world

'.encode('

utf-8

'),('

127.0.0.1

',8080))

#client.sendto(''.encode('utf-8'),('127.0.0.1',8080))

client.close()

udp粘包問題客戶端

udp傳輸一些總結:

服務端

udp協議沒有粘包

一次傳送只能有乙個接收

沒有監聽,沒有accept

udp協議時資料報協議 沒有傳送空一說 每個資料都自帶報頭

人數多,資料量大都會影響偽併發(udp傳輸不需要建立連線,發出請求直接在客戶端開啟乙個程序,少數程序看起來像是在併發)

udp通常用在查詢方面 qq基於udp 穩定傳輸512位元組以內的資料

基於UDP協議通訊的套接字

udp協議沒有粘包問題,但是緩衝區大小要足夠裝資料報大小,建議不要超過 512 服務端 服務端 import socket server socket.socket socket.af inet,socket.sock dgram 資料報協議 udp server.bind 127.0.0.1 80...

基於UDP協議的socket套接字程式設計

目錄socket套接字包括使用tcp協議和udp協議進行通訊 socket指定使用udp通訊協議server socket.socket socket.af inet,type socket.sock dgram 傳送udp資料server.sendto 傳送資料 接收udp資料data,addr ...

基於UDP協議的socket套接字程式設計

import socket server socket.socket socket.af inet,socket.sock dgram 資料報協議 udp server.bind 127.0.0.1 8080 while true data,client addr server.recvfrom 1...