文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python中的端口协议之基于UDP协议

2023-01-31 00:43

关注

UDP协议:

  1、python中基于udp协议的客户端与服务端通信简单过程实现

  2、udp协议的一些特点(与tcp协议的比较)

       3、利用socketserver模块实现udp传输协议的并发通信

-------------------------------------------------------------------------------------------------------------------------------------

一、UDP协议:OSI七层协议中的传输协议的一种(另外一种tcp协议),他们都是一种端口协议

  • 与TCP协议不同的是,UDP协议在传输时候无需双方建立双向连接,只需要知道对方的IP和PORT(端口)就可以

  而且UDP协议传输具有不安全行,或者说是即时性,给对方发送信息时候,只管发,至于他收不收得到都不会去考虑,

  不管是服务端还是客户端都一样。

  • UDP叫数据报协议,意味着发消息都带有数据报头,UDP的server不需要进行监听也无需建立连接,在启动服务之后只能被动的等待客户端发消息过来,客户端发消息的时候,要带上服务端的地址,服务端在回消息的时候,也要带上客户端的地址

  下面来简单实现基于UDP协议的客户端、服务端通信

#  服务端:

import socket
# udp传输的服务端无需半连接池,因为通信无需建立双向连接通道,无需三次握手四次挥手,只要知道对方ip和port就行
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8080))

# 通信循环
while True:
    data, client_addr = server.recvfrom(1024)  # 这里接收用recvfrom
    print('收到客户端发来的udp消息%s' % data.decode('utf-8'))
    server.sendto(data.upper(), client_addr)  # 这里发送用sendto

#  客户端:

import socket
#  无需connect服务端,因为发送时候跟上服务端ip和port就行
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

while True:
    msg = 'hello'
    client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
    data, server_addr = client.recvfrom(1024)
    print(data.decode('utf-8'))

二、UDP协议的一些特点

总结几个UDP协议的特点:

  • 客户端允许发空
  • 不会粘包
  • 服务端不存在的时候,客户端照发无误,不会报错(*-*)
  • 可以实现简单的并发效果
    # 验证UDP是否有粘包问题:
    from socket import *
    server = socket(AF_INET, SOCK_DGRAM)
    server.bind(('127.0.0.1', 8080))
    
    while True:
        data1, addr = server.recvfrom(1024)
        data2, addr = server.recvfrom(1024)
        data3, addr = server.recvfrom(1024)
        data4, addr = server.recvfrom(1024)
        data5, addr = server.recvfrom(1024)
    
        print(data1)
        print(data2)
        print(data3)
        print(data4)
        print(data5)
    
    from socket import *
    client = socket(AF_INET, SOCK_DGRAM)
    
    while True:
        client.sendto(b'Hello1', ('127.0.0.1', 8080))
        client.sendto(b'Hello2', ('127.0.0.1', 8080))
        client.sendto(b'Hello3', ('127.0.0.1', 8080))
        client.sendto(b'Hello4', ('127.0.0.1', 8080))
        client.sendto(b'Hello5', ('127.0.0.1', 8080))
    
    # 打印的每条数据都是独立的,没有2条数据在一起的情况
    UDP不存在粘包问题,是由于UDP发送的时候,没有经过Nagle算法的优化,不会将多个小包合并一次发送出去。另外,在UDP协议的接收端,采用了链式结构来记录每一个到达的UDP包,这样接收端应用程序一次recv只能从socket接收缓冲区中读出一个数据包。也就是说,发送端send了几次,接收端必须recv几次(无论recv时指定了多大的缓冲区)。

三、利用socketserver模块实现udp协议的并发通信

## 服务端:
import socketserver
from threading import currentThread  # 这里导入当前线程方法,得到当前线程名称


class MyUdpHandler(socketserver.BaseRequestHandler):
    def handle(self):
        # 这里和tcp利用socketserver模块并发的服务端不一样,tcp服务端是直接data = self.request.recv(1024)
        data, sock = self.request  # 这里多了一个sock,这个sock用于发送,同时self对象本身可以得到client_address  
        msg = '%s [%s]' % (currentThread().name, data.upper().decode('utf-8'))
        sock.sendto(msg.encode('utf-8'), self.client_address)


if __name__ == '__main__':
    server = socketserver.ThreadingUDPServer(('127.0.0.1', 8080), MyUdpHandler)
    server.serve_forever()

##  客户端
from threading import Thread,currentThread
import time
from socket import *
def task():
    client = socket(AF_INET,SOCK_DGRAM)
    addr = ('127.0.0.1', 8080)
    n = 0
    while n < 10:   # 模拟让每个客户端与服务端通信循环10次。
        msg = '%s [%s]' % (currentThread().name, n)
        client.sendto(msg.encode('utf-8'), addr)
        data, addr0 = client.recvfrom(1024)
        print(data.decode('utf-8'))
        n += 1

if __name__ == '__main__':
    for i in range(50):    # 开启50个客户端线程去连接服务端,模拟并发
        t = Thread(target=task)
        t.start()

 

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯