python之UDP网络应用程序开发

news/2024/5/18 16:00:00 标签: python, udp

文章目录

  • 版权声明
  • UDP网络应用程序开发
    • UDP初识
    • UDP知识要点
    • socket类的使用
    • UDP发送数据开发流程分析
    • UDP服务客户端通信栗子
    • UDP广播发送

版权声明

  • 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用,并非商业用途。
  • 我在整理学习笔记的过程中尽力确保准确性,但无法保证内容的完整性和时效性。本博客的内容可能会随着时间的推移而过时或需要更新。
  • 若您是黑马程序员或相关权利人,如有任何侵犯版权的地方,请您及时联系我,我将立即予以删除或进行必要的修改。
  • 对于其他读者,请在阅读本博客内容时保持遵守相关法律法规和道德准则,谨慎参考,并自行承担因此产生的风险和责任。本博客中的部分观点和意见仅代表我个人,不代表黑马程序员的立场。

UDP网络应用程序开发

UDP初识

  • UDP(User Datagram Protocol)是一种无连接的传输层协议,它不保证数据传输的可靠性和有序性,但具有传输速度快的优点
  • UDP协议可以用于音频、视频、游戏等实时应用场景,因为这些应用对数据传输的实时性要求较高,而对数据传输的可靠性和有序性要求较低。
  • UDP通信的优点是速度快,适用于实时应用场景,但缺点是不可靠,容易丢失数据,因此在需要保证数据传输可靠性的场景下不适用。
    UDP通信的基本流程如下:
  1. 发送端将要发送的数据打包成UDP数据包,包括目标IP地址、目标端口号、数据长度和数据内容等信息。

  2. 发送端将UDP数据包发送给目标主机。

  3. 接收端接收到UDP数据包后,将数据包中的信息解析出来,包括发送端IP地址、发送端端口号、数据长度和数据内容等信息。

  4. 接收端根据发送端的IP地址和端口号,将数据传输到相应的应用程序中进行处理。


UDP知识要点

  1. UDP网络通信本质不区分客户端和服务端,在实际应用中,通常会将发送数据的一方称为客户端,将接收数据的一方称为服务端。
    • 在实际应用中,客户端通常是发送请求的一方,服务端通常是提供服务的一方。例如,在客户端与服务端之间进行网络游戏通信时,客户端会向服务端发送游戏请求,服务端会接收请求并处理,然后再将处理结果发送回客户端。在这种情况下,客户端和服务端的角色是明确的。
  2. UDP协议可以直接通过对方IP地址和端口号发送数据,而不需要像TCP协议那样需要先建立连接。
    • 在UDP协议中,发送数据时需要指定目标主机的IP地址和端口号,数据直接发送到目标主机。接收数据时,可以通过绑定本地IP地址和端口号来指定接收数据的地址和端口号,然后等待数据的到来。当有数据到达时,就可以直接从数据包中获取发送方的IP地址和端口号,从而实现直接通信。
  3. 在UDP协议中,可以指定一个固定的端口用于发送和接收数据,也可以让操作系统自动选择一个空闲端口。
    • 在发送UDP数据时,可以指定源端口和目标端口。如果指定了源端口,那么每次发送数据时就会使用该端口。如果未指定源端口,操作系统会自动选择一个空闲端口,然后发送数据。在接收UDP数据时,可以指定一个固定的端口来接收数据。如果未指定端口,操作系统会自动选择一个空闲端口来接收数据。

socket类的使用

  • 参看python之TCP的网络应用程序开发的socket类的使用部分的内容
  • 栗子
  1. 创建UDP套接字对象:
    python">import socket
    
    # 创建UDP套接字对象
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
  2. 绑定本地IP地址和端口号:
    python"># 绑定本地IP地址和端口号
    local_addr = ('127.0.0.1', 8888)
    udp_socket.bind(local_addr)
    
  3. 发送UDP数据:
    python"># 发送UDP数据
    dest_addr = ('127.0.0.1', 9999)
    send_data = 'Hello, UDP!'
    udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
    
  4. 接收UDP数据:
    python"># 接收UDP数据
    recv_data, remote_addr = udp_socket.recvfrom(1024)
    print('Received from %s:%s' % remote_addr)
    print(recv_data.decode('utf-8'))
    
  5. 关闭UDP套接字对象:
    python"># 关闭UDP套接字对象
    udp_socket.close()
    

UDP发送数据开发流程分析

  • 服务端:
    1. 创建UDP套接字对象
    2. 绑定本地IP地址和端口号
    3. 接收UDP数据
    4. 发送UDP数据
    5. 关闭UDP套接字对象
  • 客户端:
    1. 创建UDP套接字对象
    2. 发送UDP数据
    3. 接收UDP数据
    4. 关闭UDP套接字对象

UDP服务客户端通信栗子

  • UDP服务端
python">import socket

if __name__ == '__main__':
    # 创建UDP套接字对象
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 设置为非阻塞模式
    udp_socket.setblocking(False)

    # 绑定本地IP地址和端口号
    local_addr = ('127.0.0.1', 8888)
    udp_socket.bind(local_addr)

    while True:
        try:
            # 接收UDP数据
            recv_data, remote_addr = udp_socket.recvfrom(1024)
            print('Received from %s:%s' % remote_addr)
            print(recv_data.decode('utf-8'))

            # 发送UDP数据
            send_data = 'Hello, UDP客户端!'
            udp_socket.sendto(send_data.encode('utf-8'), remote_addr)
        except BlockingIOError:
            pass
    # 发送UDP数据
    send_data = 'Hello, UDP客户端!'
    udp_socket.sendto(send_data.encode('utf-8'), remote_addr)

    # 关闭UDP套接字对象
    udp_socket.close()

  • UDP客户端
python">import socket
if __name__ == '__main__':
    # 创建UDP套接字对象
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 设置为非阻塞模式
    udp_socket.setblocking(False)

    # 发送UDP数据
    dest_addr = ('127.0.0.1', 8888)
    send_data = 'Hello, UDP服务端!'
    udp_socket.sendto(send_data.encode('utf-8'), dest_addr)

    # 接收UDP数据
    while True:
        try:
            recv_data, remote_addr = udp_socket.recvfrom(1024)
            print('Received from %s:%s' % remote_addr)
            print(recv_data.decode('utf-8'))
            break
        except BlockingIOError:
            pass

    # 关闭UDP套接字对象
    udp_socket.close()

UDP广播发送

  • 广播地址(Broadcast Address)是专门用于同时向网络中所有工作站进行发送的一个地址

  • 广播地址是一个特殊的IP地址,用于向一个网络中的所有设备发送数据。在IPv4中,广播地址是由主机地址全为1和网络地址组成的地址。例如,如果你的网络地址是192.168.1.0,那么广播地址就是192.168.1.255。

python">import socket

if __name__ == '__main__':
    # 创建UDP套接字对象 将UDP套接字对象设置为广播模式
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 设置广播选项 socket.SO_BROADCAST广播
    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

    # 广播地址
    dest_addr = ('192.168.1.255', 8888)

    # 发送UDP数据
    send_data = 'Hello, UDP broadcast!'
    udp_socket.sendto(send_data.encode('utf-8'), dest_addr)

    # 关闭UDP套接字对象
    udp_socket.close()


http://www.niftyadmin.cn/n/5214450.html

相关文章

Linux系统的研究

摘要: Linux是一个开源的Unix-like操作系统,由林纳斯托瓦兹在1991年首次发布。由于其开放性和灵活性,Linux已成为许多企业和个人用户的重要选择。本文将探讨Linux系统的历史、特点、应用领域以及优缺点。 一、引言 Linux系统的开发始于1980年…

【Linux】指令详解(三)

目录 1. 前言2. 常见指令2.1 重定向2.1.1 >2.1.2 >>2.1.3 < 2.2 与文件有关指令2.2.1 more2.2.2 less &#xff08;推荐使用&#xff09;2.2.3 head2.2.4 tail2.2.5 wc2.2.6 | 2.3 find2.4 grep 3. 时间相关的指令3.1 data3.2 时间戳3.3 cal 4. zip/unzip 1. 前言 …

【C语言】Debian10使用zlib库crc32()函数

crc32函数原型 uint32_t crc32(uint32_t crc, const Bytef *buf, uInt len); 参数说明 crc&#xff1a;初始的CRC值或者之前计算得到的CRC值。在初次调用时&#xff0c;通常使用0xFFFFFFFF作为初始值。buf&#xff1a;指向数据缓冲区的指针&#xff0c;包含需要计算CRC的数据…

服务器连接github

https://zhuanlan.zhihu.com/p/543490354 比着这个一步步做就行。 https://blog.l0v0.com/posts/94ffdbdf.html 上传文件可以看这个 注意&#xff1a; 密钥ssh-keygen设置好之后&#xff0c;以后就不用每次输入账号密码才能访问了。 otherwise&#xff0c;每次要输入账号密码。…

8.AUTOSAR 诊断栈分析(一)

目录 1.错误分级分类 2.错误上报方法 2.1 API上报 2.2 预定义的Callout上报 2.3 DET(Default Error Tracer)相关Hook或者Callout上报 2.4 DEM相关错误处理 2.5 DLT相关错误处理 3.小结 终于来到了整个ECU的核心&#xff1a;诊断Dianostic。 为了更加系统地了解诊断…

【测试开发工程师】TestNG测试框架零基础入门(上)

哈喽大家好&#xff0c;我是小浪。那么今天是一期基于JavaTestNG测试框架的入门教学的博客&#xff0c;从只会手工测试提升到自动化测试&#xff0c;这将对你的测试技术提升是非常大的&#xff0c;有助于我们以后在找工作、面试的时候具备更大的竞争力~ 文章目录 一、什么是T…

大数据技术之数据安全与网络安全——CMS靶场(文章管理系统)实训

大数据技术之数据安全与网络安全——CMS靶场(文章管理系统)实训 在当今数字化时代&#xff0c;大数据技术的迅猛发展带来了前所未有的数据增长&#xff0c;同时也催生了对数据安全和网络安全的更为迫切的需求。本篇博客将聚焦于大数据技术背景下的数据安全与网络安全&#xff…

谈谈基于Redis的分布式锁

目录 前言 基本介绍 演化过程 防死锁 防误删 自动续期 可重入 主从一致 总结 前言 在我们没有了解分布式锁前&#xff0c;使用最多的就是线程锁和进程锁&#xff0c;但他们仅能满足在单机jvm或者同一个操作系统下&#xff0c;才能有效。跨jvm系统&#xff0c;无法…