基于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()
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传输存在粘包问题
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()
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协议没有粘包
一次发送只能有一个接收
没有监听,没有accept
udp协议时数据包协议 没有发送空一说 每个数据都自带报头
人数多,数据量大都会影响伪并发(udp传输不需要建立连接,发出请求直接在客户端开启一个进程,少数进程看起来像是在并发)
udp通常用在查询方面 qq基于udp 稳定传输512字节以内的数据
越是困难的事越要立即去做,这样收益才会最大!!!