基于udp协议的套接字及udp协议粘包问题

时间:2023-03-09 05:55:10
基于udp协议的套接字及udp协议粘包问题

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协议传输会直接造成数据丢失,不可靠传输。
# 而不是和tcp传输一样,在不解决粘包的情况下,下一条命令依然接受上一条命令请求的内容。
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字节以内的数据