简介

在网络通信编程中,用的最多的就是UDP和TCP通信了,原理这里就不分析了,网上介绍也很多,这里简单列举一下各自的优缺点和使用场景

通信方式 优点 缺点 适用场景
UDP 及时性好,快速 视网络情况,存在丢包 与嵌入式设备通信,实时控制场景
TCP 丢包会自动重发,理论上不用担心丢包问题 延时相对大一些 通信可靠性场景,比如IoT设备控制,状态同步

例程一:UDP server端,UDP数据接收

#!/usr/bin/python3
# -*- coding: utf-8 -*-"""
udp通信例程:udp server端,修改udp_addr元组里面的ip地址,即可实现与目标机器的通信,
此处以单机通信示例,ip为127.0.0.1,实际多机通信,此处应设置为目标客户端ip地址
"""
__author__ = "River.Yang"
__date__ = "2021/4/30"
__version__ = "1.0.0"from time import sleep
import socketdef main():# udp 通信地址,IP+端口号udp_addr = ('127.0.0.1', 9999)udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定端口udp_socket.bind(udp_addr)# 等待接收对方发送的数据while True:recv_data = udp_socket.recvfrom(1024)  # 1024表示本次接收的最大字节数# 打印接收到的数据print("[From %s:%d]:%s" % (recv_data[1][0], recv_data[1][1], recv_data[0].decode("utf-8")))if __name__ == '__main__':print("当前版本: ", __version__)print("udp server ")main()

代码解析

  1. socket函数中第二个参数就是通信类型,此处SOCK_DGRAM 就是指定使用UDP通信
  2. 服务端需要使用bind函数绑定端口,客户端不需要,因为客户端发送的时候已经带了端口参数

例程二:UDP client端,UDP数据发送

#!/usr/bin/python3
# -*- coding: utf-8 -*-"""
udp通信例程:udp client端,修改udp_addr元组里面的ip地址,即可实现与目标机器的通信,
此处以单机通信示例,ip为127.0.0.1,实际多机通信,此处应设置为目标服务端ip地址
"""__author__ = "River.Yang"
__date__ = "2021/4/30"
__version__ = "1.0.0"from time import sleep
import socketdef main():# udp 通信地址,IP+端口号udp_addr = ('127.0.0.1', 9999)udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 发送数据到指定的ip和端口,每隔1s发送一次,发送10次for i in range(10):udp_socket.sendto(("Hello,I am a UDP socket for: " + str(i)) .encode('utf-8'), udp_addr)print("send %d message" % i)sleep(1)# 5. 关闭套接字udp_socket.close()if __name__ == '__main__':print("当前版本: ", __version__)print("udp client ")main()

例程三:多线程实现UDP数据收发

#!/usr/bin/python3
# -*- coding: utf-8 -*-"""
python多线程通信
"""
__author__ = "River.Yang"
__date__ = "2021/3/24"
__version__ = "1.0.0"from time import sleep
import socket
import threading# 定义全局变量
t1_count = 0
t2_count = 0def udp_received_hundle(s):global t1_countprint("this is thread 1 running")while True:t1_count += 1print("thread 1 第 %s 次运行" % t1_count)recv_data = s.recvfrom(1024)  # 1024表示本次接收的最大字节数# 打印接收到的数据print("[From %s:%d]:%s" % (recv_data[1][0], recv_data[1][1], recv_data[0].decode("utf-8")))def udp_send_hundle(s):global t2_countprint("this is thread 2 running")while True:t2_count += 1print("")print("thread 2 第 %s 次运行" % t2_count)s.sendto(("Hello,I am a UDP socket for: " + str(t2_count)).encode('utf-8'), udp_addr)print("send %d message" % t2_count)print("")sleep(1)if __name__ == '__main__':print("当前版本: ", __version__)# 初始化# udp 通信地址,IP+端口号udp_addr = ('127.0.0.1', 9999)udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定端口:udp_socket.bind(udp_addr)# 定义线程thread_list = []t1 = threading.Thread(target=udp_received_hundle, args=(udp_socket, ))thread_list.append(t1)t2 = threading.Thread(target=udp_send_hundle, args=(udp_socket, ))thread_list.append(t2)for t in thread_list:t.setDaemon(True)t.start()for t in thread_list:t.join()print("exit all task.")print('all process end.')

代码解析

  1. 这里用到了多线程,虽然python中的多线程是假的多线程,实际上是一个线程分时复用,这里我们不深究,如果平常用到也就几个小任务跑一跑,抄我这个作业就ok。
  2. 多线程实际上是从t.join()后才开始正式运行的,这里一定要注意,不能漏了这个函数。
  3. udp的收发与上面的例程几乎是一样的。

代码运行效果如下

当前版本:  1.0.0
this is thread 1 running
thread 1 第 1 次运行
this is thread 2 runningthread 2 第 1 次运行
send 1 message[From 127.0.0.1:9999]:Hello,I am a UDP socket for: 1
thread 1 第 2 次运行thread 2 第 2 次运行
send 2 message[From 127.0.0.1:9999]:Hello,I am a UDP socket for: 2
thread 1 第 3 次运行thread 2 第 3 次运行
send 3 message[From 127.0.0.1:9999]:Hello,I am a UDP socket for: 3
thread 1 第 4 次运行thread 2 第 4 次运行
send 4 message[From 127.0.0.1:9999]:Hello,I am a UDP socket for: 4
thread 1 第 5 次运行thread 2 第 5 次运行
send 5 message

结语

udp通信比较复杂,但实际用起来并不难,这里只是抛转引玉,给大家一个示例参考,在实际应用过程中,涉及到复杂数据通信,还需要使用通信协议,协议收发,解包等函数,另外数据缓存也很关键,尤其是大数据量的情况下,通常会用到队列相关知识,这一部分就留给大家自行研究吧,有机会也可以讲一讲,如果这篇文章对你有用,不妨点赞关注,你的支持是我最大的动力。

·
·
·

欢迎各位老铁一键三连,本号后续会不断更新树莓派、人工智能、STM32、ROS小车相关文章和知识。
如果这篇文章对你有用,不妨点赞关注,你的支持是我最大的动力
大家对感兴趣的知识点可以在文章下面留言,我可以优先帮大家讲解哦

欢迎大家光临我的淘宝小店【玩转智能机器人】,会定期推出教程中使用的物美价优的硬件,你的光临就是对我的支持

原创不易,转载请说明出处。

python网络编程——UDP通信附实例参考相关推荐

  1. 网络编程 UDP通信的过程 TCP通信过程 多线程文件上传

    网络概述 协议 在网络之间传出数据时需要按照指定的标准来传输,标准中规定了数据的格式.大小.传输的方式.传输速率.形成统一规范->按照规范开发的代码->协议(应用层.传输层.网络层.链路层 ...

  2. qt triggered信号_Qt之网络编程UDP通信

    点击上方"Qt学视觉",选择"星标"公众号重磅干货,第一时间送达 想要学习的同学们还请认真阅读每篇文章,相信你一定会有所收获 UDP通信概述 UDP(UserD ...

  3. python网络编程—UDP协议

    一.UDP协议特点: UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送.UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之 ...

  4. python网络编程—UDP的echo服务

    一.echo服务 echo服务是一种非常有用的用于调试和检测的工具,该协议接收到什么原样返回客户端 二.代码实现echo服务 需求 UDP客户端.客户端可以发送多条数据,2.客户端如果发送一个&quo ...

  5. python网络编程--UDP客户端

    0x01 环境 python.pycharm 0x02 程序 # -*- coding:utf-8 -*-import sockettarget_host='127.0.0.1' target_par ...

  6. [Java网络编程]UDP通信程序练习

    代码如下: package UdpPracticePack;import java.io.BufferedReader; import java.io.IOException; import java ...

  7. python网络编程-异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-03

    python网络编程-异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-03 参考文章: (1)python网络编程-异常处理-异常捕获-抛出异常-断言-自 ...

  8. python编程实例下载-python网络编程之文件下载实例分析

    本文实例讲述了python网络编程之文件下载实现方法.分享给大家供大家参考.具体如下: 真是越看越喜欢python啊,想要了解它提供的http和ftp下载功能,原来是如此的简单. 1.相应模块 ftp ...

  9. python网络编程实例简析

    本文实例讲述了python网络编程,分享给大家供大家参考. 具体方法如下: 服务端代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 from SocketS ...

最新文章

  1. 【[SCOI2010]序列操作】
  2. PyTorch 1.8来了!正式支持AMD GPU,炼丹不必NVIDIA
  3. 集合框架源码学习之HashMap(JDK1.8)
  4. python3导入特定的成员
  5. HTML5+CSS3实现的小风车-转动的童年
  6. 杭州计算机学校哪家好,杭州2021年哪所计算机学校比较好
  7. 【Python基础知识-pycharm版】第三节-列表
  8. 新生成长记;关于zzulioj1056,幸运数字
  9. guiconsole 操作命令
  10. php passport security,php写的Passport加密函数
  11. UniCode 常用字符大全
  12. android 图片跑马灯动画,Android实现图文垂直跑马灯效果
  13. 2022长三角数学建模A题:学在长三角
  14. NLP学习笔记「第二章」2.2 N-gram Language Models(N元语言模型)
  15. Mockito3.8 如何mock静态方法 (如何mock PageHelper)
  16. js html页面原生js横向打印
  17. Linux 中的TAB键妙用
  18. 卸载 ibus 使Ubuntu16.04任务栏与桌面图标消失
  19. DialogFragment以及AlertDialogFragment
  20. Python全栈(八)Flask项目实战之8.CMS后台轮播图管理

热门文章

  1. php进程 异常退出,记一次进程异常退出的问题排查
  2. python中run函数作用_Python subprocess中的run方法
  3. linux日志 centos7日志文件过大 清空大文件 tomcat日志过大 catalina.out等
  4. 微信wx.getUserProfile接口不弹出授权框都返回微信用户和灰色头像问题和解决方案
  5. 【TWVRP】基于matlab遗传算法求解多车场开放式多商品带时间窗的车辆路径规划问题【含Matlab源码 1849期】
  6. STM32开发实例 基于STM32单片机的城市地下管廊监测
  7. 反向传播(BP算法)python实现
  8. vba 图表 大小 定位_VBA小技巧08: 调整工作表中所有图表尺寸并使其大小相同
  9. 雪球(Snow Ball)定价实作:使用Heston模型与GPU加速运算
  10. Keras神经网络的学习与使用(1)