Python UDP编程

news2024/12/22 23:02:24

前面我们讲了 TCP 编程,我们知道 TCP 可以建立可靠连接,并且通信双方都可以以流的形式发送数据。本文我们再来介绍另一个常用的协议--UDP。相对TCP,UDP则是面向无连接的协议。

UDP 协议

我们来看 UDP 的定义:

UDP 协议(User Datagram Protocol),中文名是用户数据报协议,是 OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

从这个定义中,我们可以总结出 UDP 的几个特点以及其与 TCP 的区别:

  • UDP 是用户数据报协议,传输模式是数据报,而 TCP 是基于字节流的传输协议。

  • UDP 是无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

  • UDP 是简单不可靠的协议,它不提供可靠性,只是把数据包发送出去,并不保证能够到达目的地。由于它不需要在客户端和服务端之间建立连接,也没有超时重发机制,所以传输速度很快。

从以上特点,我们可以看到 UDP 适合应用在每次传输数据量小、对数据完整性要求不高、对传输速度要求高的领域。这里面最典型的就是即时通信的场景,微信是一个很常见的例子。相信大家在使用微信的时候都遇到过先发的消息后收到,或者有些发送的消息对方没有收到的情况吧,这就是 UDP 协议典型的特点,不保证传输数据的完整性和顺序性。除此之外, UDP 还应用在在线视频、网络电话等场景。

UDP 传输过程

我们在讲 TCP 的时候,我们说 TCP 客户端和服务端必须先连接才可以传输数据:客户端先请求连接服务器,服务器接受连接请求,然后双方才可以通信。在 UDP 协议里,客户端只需要知道服务器的地址和端口号,就可以直接发送数据了。

我们来看下 UDP 传输的流程图:

图片

TCP服务器的建立可以归纳这几步:

  • 创建 socket(套接字)

  • 绑定 socket 的 IP 地址和端口号

  • 接收客户端数据

  • 关闭连接

TCP客户端的创建可总结为这几步:

  • 创建 socket(套接字)

  • 向服务器发送数据

  • 关闭连接

这里需要注意的是 UDP 客户端连接到服务器的 IP 和端口号必须是 UDP 服务器的 IP 和监听的端口号,服务器服务器只需要绑定 IP 和端口号,就可以时刻准备接收客户端发送的数据,此时服务器处于阻塞状态,直到接收到数据为止。

UDP 客户端

创建 socket,可以这样做:

# 导入socket库import socket# 创建一个sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

创建 socket 时,第一个参数 socket.AF_INET 表示指定使用 IPv4 协议,如果要使用 IPv6 协议,就指定为 socket.AF_INET6。SOCK_DGRAM 指定基于 UDP 的数据报式 Socket 通信。

创建了 socket 之后,我们就可以向目标地址发送数据报了:​​​​​​​

# 发送数据s.sendto(b'Hello Server', ('127.0.0.1', 6000))

第一个参数是需要发送的数据报内容,第二个参数是 IP 地址和端口号的二元组。

如果是接收数据的话,我们可以这样写:​​​​​​​

# 接收数据data, addr = s.recv(1024)# 解码接收到的数据data = data.decode('utf-8')

接收信息的时候,第一个 data 表示接收到的数据, addr 是对方的 IP 地址和端口号的二元组。

想要关闭 socket,直接调用 close() 方法即可:​​​​​​​

# 关闭 socketsocket.close()

UDP 服务器

相比于客户端,服务器端只是多了一个步骤,在创建 socket 之后,需要绑定一个 IP 地址和端口号,以便接收客户端随时可能发送过来的数据。绑定的方法为:​​​​​​​

# 绑定 IP 和端口s.bind(('127.0.0.1', 6000))

UDP 简单实例

我们通过一个简单的实例来体会下 UDP 的客户端和服务器的通信流程。

服务器代码为:​​​​​​​

import socket# 创建 socketsk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定 IP 和端口号sk.bind(('127.0.0.1', 6000))while True:    # 接收数据报    msg, addr = sk.recvfrom(1024)    # 打印    print('来自[%s:%s]的消息: %s' % (addr[0], addr[1], msg.decode('utf-8')))    # 等待输入    inp = input('>>>')    # 发送数据报    sk.sendto(inp.encode('utf-8'), addr)# 关闭 socketsk.close()

这里,我们先创建 socket,然后绑定本机的6000端口,然后等待接收客户端发送的数据报,接收到数据后将数据内容打印在控制台。然后可以在控制台输入回复内容,发送给客户端。

客户端代码:​​​​​​​

import socket# 创建 socketsk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)addr = ('127.0.0.1', 6000)while True:    # 等待输入    msg = input('>>>')    # 发送数据报    sk.sendto(msg.encode('utf-8'), addr)    # 接收数据报    msg_recv, addr = sk.recvfrom(1024)    # 打印    print(msg_recv.decode('utf-8'))# 关闭 socketsk.close()

在客户端代码中,我们就只是创建 socket,然后在控制台输入需要向服务器发送的内容,通过 sentto() 方法发送给服务器,然后接收服务器返回的内容,将接收的内容打印到控制台。

分别运行客户端和服务器代码,然后我们在客户端的控制台输入 “hello server”,我们可以看到服务器的控制台打印了客户端发送的内容,然后我们在服务器控制台输入 “hello client”,同样在客户端控制台可以看你到内容。

下面是客户端的控制台内容:​​​​​​​

>>>hello serverhello client>>>

下面是服务器的控制台内容:​​​​​​​

来自[127.0.0.1:61207]的消息: hello server>>>hello client

这个实例其实就是一个简单的聊天模型,客户端和服务器就像两个人一样可以发送和接收对方的信息。

那么多人群聊怎么实现呢?简单来说,我们需要设置一台中心服务器,我们每个人发送的内容都先发送到中心服务器,然后中心服务器再转发到每个群聊的人。

总结

本文为大家介绍了 UDP 编程的基本原理以及通过 Python 实现一个最简单的聊天程序来模拟 UDP 通信的过程。通过本文的学习,我们需要对 UDP 协议有基本的认识,以及对 UDP 的通信过程比较熟悉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/954863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ABB PCD231B101励磁控制模块

电磁励磁控制: PCD231B101 模块专门设计用于电磁励磁设备的控制,以确保发电机的励磁电流和电压维持在合适的水平。 多通道控制: 这种模块通常具有多个控制通道,可用于同时监测和控制多台电力发电机。 通讯接口: PCD2…

AI机器视觉赋能电池缺陷检测,深眸科技助力新能源行业规模化发展

新产业周期下,新能源行业风口已至,现代社会对于新能源电池产品需求量加大,对产品的质量安全也更加重视。当前,传统的检测方法已经不能满足新能源电池行业的发展,越来越多的厂商开始应用创新机器视觉技术与产品于生产环…

受老板器重的项目经理都是这样工作的

大家好,我是老原。 当了领导才明白,那些优秀的人都一个样。 “平庸的人各有各的平庸,优秀的人基本都一样” 作为普通员工,身边的内卷的、单纯的、摸鱼的、斤斤计较的、慷慨无私的……各种各样的都有,有时候聚在一起…

安防监控视频平台EasyCVR视频汇聚平台定制项目增加AI智能算法详细介绍

安防视频集中存储EasyCVR视频汇聚平台,可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等功能。为了便…

无涯教程-Android Online Test函数

Android在线测试模拟了真正的在线认证考试。您将看到基于 Android概念的多项选择题(MCQ),将为您提供四个options。您将为该问题选择最合适的答案,然后继续进行下一个问题,而不会浪费时间。完成完整的考试后,您将获得在线考试分数。 总问题数-20 最长时间-20分钟 Start Test …

《信息系统项目管理师教程(第4版)》第15章 项目风险管理 知识点汇总

文章只对常见考点进行整理,有关项目风险管理的完整知识还请参照教程。 风险基础知识 1、风险的属性 随机性相对性可变性 2.风险的分类 按后果分:纯粹风险、投机风险,纯粹风险和 投机风险在一定条件下可以互相转化 按可预测性分&#xff…

23 Linux高级篇-Linux内核介绍内核升级

23 Linux高级篇-Linux内核介绍&内核升级 文章目录 23 Linux高级篇-Linux内核介绍&内核升级23.1 linux-0.01内核介绍23.1.1 为什么要阅读Linux内核?23.1.2 下载linux-0.01内核源码23.1.3 linux-0.01内核介绍 23.3 Linux内核升级23.3.1 最新版内核介绍23.3.2 …

AMEYA360:ROHM开发出适用于条码标签打印应用、超快打印速度的热敏打印头

AMEYA360:ROHM开发出适用于条码标签打印应用、超快打印速度的热敏打印头 全球知名半导体制造商ROHM(总部位于日本京都市)新推出两款高可靠性高速热敏打印头 “TE2004-QP1W00A(203dpi)”和“TE3004-TP1W00A(300dpi)”,新产品非常适用于物流和库存管理等领…

基础论文学习(6)——BeiT

BEiT 是把 BERT 模型成功用在 image 领域的首创,也是一种自监督训练的形式,所以取名为视觉Transformer的BERT预训练模型。这个工作用一种巧妙的办法把 BERT 的训练思想成功用在了 image 任务中。 BERT:Bidiractional(双向) Encoder Represen…

助力森林火情烟雾检测预警,基于YOLOv5全系列模型[n/s/m/l/x]开发构建无人机航拍场景下的森林火情检测识别系统

森林防火一直是非常重要的事情,火情的早发现早预警就能及早扑灭,对社会安全有着重要的意义,近些年来随着AI技术的快速发展,AI与各行各业有了很多成功的合作案例,这里主要的思想就是在无人机航拍视角的场景构想下开发构…

Vue2项目练手——通用后台管理项目第三节

Vue2项目练手——通用后台管理项目 首页组件布局个人信息展示使用的组件App.vueHome.vue 列表信息展示使用的组件Home.vue 订单统计Home.vue 数据的请求axios的基本使用二次封装文件目录src/api/index.jssrc/utils/request.jsHome.vue 首页组件布局 个人信息展示 使用的组件 …

Doris(六)--通过 Canal 同步数据到 Doris 中

pre 开启 mysql Binlog 网上有众多方法,自行百度。 查询是否成功,在 mysql 客户端输入 show BINARY LOGS; 出现如下提示,即表示 big log 正常开启。 1,下载 canal 服务端 传送门 注意:下载 canal.deployer-xxx …

惹人喜爱的朋友圈背景图

分享一波可爱喜庆的朋友圈背景图,快来看看有没有你喜欢的吧~ ​

Flutter 安装教程 + 运行教程

1.下载依赖 https://flutter.cn/docs/get-started/install/windows 解压完后根据自己的位置放置,如(D:\flutter) 注意 请勿将 Flutter 有特殊字符或空格的路径下。 请勿将 Flutter 安装在需要高权限的文件夹内,例如 C:\Program …

秋招刷题推荐

参加了24年秋招,除了常见的LC,还需要重点刷某些大厂的常见题 http://codefun2000.com 优点1: 题目全部改编自公司笔试真题,可以做做往年真题练手。 优点2: 该平台和公司笔试模式一样,都是Acm输入输出,更有利于准备秋招…

【Tkinter系列08/15】小部件(Radiobutton、Scale)

20. 小部件Radiobutton 单选按钮是一组相关的小部件,允许 用户,仅选择一组选项中的一个。每 单选按钮由指示器和标签两部分组成: 指示器是变为红色的菱形部分 在所选项目中。 标签是文本,但您可以使用图像或位图作为标签。 如果…

【Python】从入门到上头— IO编程(8)

文章目录 一.IO编程是什么二.文件读写1.读取文件2.file-like Object二进制文件字符编码 3.写文件file对象的常用函数常见标识符 三.StringIO和BytesIO1.StringIO2.BytesIO 四.操作文件和目录五.序列化和反序列化1.pickle.dumps()2.pickle.loads()3.JSON 一.IO编程是什么 IO在计…

聊聊二叉树的前序遍历算法

二叉树顾名思义,一个根节点只会有两个分叉对应,下图所示: 前序遍历先去拿它的左节点,拿完之后再去拿它左节点相邻的右节点,如数据结构是这样 第一中不考虑性能的方式的话,可以使用递归的方式去给他遍历 fun…

Linux下的系统编程——文件与目录操作(六)

前言: 在Linux系统中,文件和目录的操作非常灵活。用户可以通过命令行或者图形界面来进行操作。下面是Linux文件和目录操作的一些常见操作: 一、文件系统 1.inode 其本质为结构体,存储文件的属性信息。如:权限、类型、大小、时间…

抖音电商,提前批offer!

南京夫子庙茶颜悦色店 摄于2023.8.27 小伙伴们大家好,我是阿秀。 互联网圈有个梗就是"两大码农工厂:南华科、北北邮",就是说这两所高校的毕业生从事互联网工作的特别多,北邮虽然是211,但在互联网圈子里比很多…