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的应用)

Linux-UDP协议(传输层协议)-知名端口-UDP协议特点-UDP协议格式

udp协议的用途

UDP协议是啥

UDP、TCP 协议区别?

网络协议_UDP详谈