UDP协议
Posted yushan1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UDP协议相关的知识,希望对你有一定的参考价值。
1. udp协议
# *****************udp服务端****************
# 基础版本
import socket
# udp
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1',8000))
# udp不要建立连接,直接发
# 需不需要监听?
# 跟tcp的不是一样的
# data = server.recvfrom(1024)
data,addr = server.recvfrom(1024)
# data 是个元组,第一个参数是数据部分,第二个参数是客户端地址
print(data)
server.sendto(data.upper(),addr)
# 加入通信循环
import socket
# udp
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1',8000))
while True:
data,addr = server.recvfrom(1024)
print(data)
server.sendto(data.upper(),addr)
# *****************udp客户端****************
# 基础版本
import socket
# udp
client = socket.socket(type=socket.SOCK_DGRAM)
# 直接发
client.sendto(b'lqz',('127.0.0.1',8000))
data = client.recvfrom(1024)
print(data)
# 加入通信循环
import socket
# udp
client = socket.socket(type=socket.SOCK_DGRAM)
while True:
msg = input('请输入要发送的数据:')
# 直接发
client.sendto(msg.encode('utf-8'),('127.0.0.1',8000))
data = client.recvfrom(1024)
print(data)
2. udp协议是否粘包
# *****************udp服务端****************
# udp 协议没有粘包问题(udp协议又叫数据报协议),可以发空,tcp不行
import socket
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1',8000))
while True:
data,addr = server.recvfrom(1024)
print(data)
server.sendto(data.upper(),addr)
data,addr = server.recvfrom(1024)
print(data)
data,addr = server.recvfrom(1024)
print(data)
data,addr = server.recvfrom(1024)
print(data)
data,addr = server.recvfrom(1024)
print(data)
# *****************udp客户端****************
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
while True:
msg = input('>>>:')
client.sendto(msg.encode('utf-8'),('127.0.0.1',8000))
data = client.recvfrom(1024)
print(data)
client.sendto('lqz'.encode('utf-8'),('127.0.0.1',8000))
client.sendto('hello'.encode('utf-8'),('127.0.0.1',8000))
client.sendto('world'.encode('utf-8'),('127.0.0.1',8000))
client.sendto(''.encode('utf-8'),('127.0.0.1',8000))
# ***********udp客户端丢包****************
import socket
# udp 不会管客户端或者服务端是否收到,它只管发,所以不可靠
client = socket.socket(type=socket.SOCK_DGRAM)
while True:
msg = input('>>>:')
client.sendto(msg.encode('utf-8'),('127.0.0.1',8000))
data = client.recvfrom(1024)
print(data)
# udp特点
# 可以发空(数据报协议,自带头)
# 客户端和服务端可以有一方没在线(因为不需要建立连接)
3. socketserver模块udp
# **************socketserver服务端************
# 使用socketsever写服务端
# 导入模块
import socketserver
# 自己定义一个类,必须继承BaseRequestHandler
class MyTcp(socketserver.BaseRequestHandler):
# 必须重写handle方法
def handle(self):
print(self)
# 数据
print(self.request[0])
print(self.request[1])
print(type(self.request[1]))
self.request[1].sendto('xxxx'.encode('utf-8'),self.client_address)
try:
while True: # 通信循环
data = self.request.recvfrom(1024)
print(data)
except Exception:
pass
if __name__ == '__main__':
# 实例化得到一个tcp连接的对象,Threading意思是说,只要来了请求,它自动的开线程来处理连接跟交互数据
server = socketserver.ThreadingUDPServer(('127.0.0.1', 8000), MyTcp)
# 一直在监听
# 这么理解:只要来一个请求,就起一个线程(造一个人,做交互)
server.serve_forever()
# **************client_通信循环**************
import socket
# udp
client = socket.socket(type=socket.SOCK_DGRAM)
client.sendto('lqz'.encode('utf-8'),('127.0.0.1',8000))
client.sendto('hello'.encode('utf-8'),('127.0.0.1',8000))
client.sendto('world'.encode('utf-8'),('127.0.0.1',8000))
client.sendto(''.encode('utf-8'),('127.0.0.1',8000))
data = client.recvfrom(1024)
print(data)
4. socketserver模块
# **************socketsever服务端*************
# 使用socketserver写服务端
# 导入模块
import socketserver
# 自己定义一个类,必须继承BaseRequestHandler
class MyTcp(socketserver.BaseRequestHandler):
# 必须重写handle方法
def handle(self):
try:
while True: # 通信循环
print(self)
# 给客户端回消息
# conn对象就是request
# 接收数据
print(self.client_address)
data = self.request.recv(1024)
print(data)
if len(data) == 0:
return
# 发送数据
self.request.send(data.upper())
except Exception:
pass
if __name__ == '__main__':
# 实例化得到一个tcp连接的对象,Threading意思是说,只要来了请求,它自动的开线程来处理连接跟交互数据
server = socketserver.ThreadingTCPServer(('127.0.0.1',8001),MyTcp)
# 一直在监听
# 这么理解:只要来一个请求,就起一个线程(造一个人,做交互)
server.serve_forever()
# *************client_通信循环**************
import socket
soc = socket.socket()
soc.connect(('127.0.0.1',8001))
while True:
soc.send('xxxx'.encode('utf-8'))
print(soc.recv(1024))
以上是关于UDP协议的主要内容,如果未能解决你的问题,请参考以下文章
UDP协议详解(UDP协议特点,UDP协议格式UDP的应用)