前面我们讲了 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 传输的流程图:

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

创建 socket(套接字)

绑定 socket 的 IP 地址和端口号

接收客户端数据

关闭连接

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

创建 socket(套接字)

向服务器发送数据

关闭连接

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

UDP 客户端

创建 socket,可以这样做:

# 导入socket库

import socket

# 创建一个socket

s = 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() 方法即可:

# 关闭 socket

socket.close()

UDP 服务器

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

# 绑定 IP 和端口

s.bind(('127.0.0.1', 6000))

UDP 简单实例

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

服务器代码为:

import socket

# 创建 socket

sk = 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)

# 关闭 socket

sk.close()

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

客户端代码:

import socket

# 创建 socket

sk = 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'))

# 关闭 socket

sk.close()

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

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

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

>>>hello server

hello client

>>>

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

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

>>>hello client

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

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

总结

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

以上就是详解python UDP 编程的详细内容,更多关于python UDP 编程的资料请关注脚本之家其它相关文章!

python udp编程_详解python UDP 编程相关推荐

  1. python归一化处理_详解python实现数据归一化处理的方式:(0,1)标准化

    在机器学习过程中,对数据的处理过程中,常常需要对数据进行归一化处理,下面介绍(0, 1)标准化的方式,简单的说,其功能就是将预处理的数据的数值范围按一定关系"压缩"到(0,1)的范 ...

  2. python列表拆包_详解python 拆包可迭代数据如tuple, list

    详解python 拆包可迭代数据如tuple, list 拆包是指将一个结构中的数据拆分为多个单独变量中. 以元组为例: >>> a = ('windows', 10, 25.1, ...

  3. python操作目录_详解python中的文件与目录操作

    详解python中的文件与目录操作 一 获得当前路径 1.代码1 >>>import os >>>print('Current directory is ',os. ...

  4. python模式匹配算法_详解Python 最短匹配模式

    问题 你正在试着用正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配. 而你想修改它变成查找最短的可能匹配. 解决方案 这个问题一般出现在需要匹配一对分隔符之间的文本的时候(比如引号包含的字 ...

  5. python opencv 直方图均衡_详解python OpenCV学习笔记之直方图均衡化

    本文介绍了python OpenCV学习笔记之直方图均衡化,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/d5/daf/tutorial_py_hi ...

  6. python xlrd安装_详解python中xlrd包的安装与处理Excel表格

    一.安装xlrd 地址 下载后,使用 pip install .whl安装即好. 查看帮助: >>> import xlrd >>> help(xlrd) Help ...

  7. python制作界面_详解python做UI界面的方法

    详解python做UI界面的方法 更新时间:2019年02月27日 14:44:34 投稿:laozhang 在本文里我们给大家整理了关于python做UI界面的方法和具体步骤,对此有需要的朋友们可以 ...

  8. python namedtuple用法_详解Python中namedtuple的使用

    namedtuple是Python中存储数据类型,比较常见的数据类型还有有list和tuple数据类型.相比于list,tuple中的元素不可修改,在映射中可以当键使用. namedtuple: na ...

  9. python gil 解除_详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案

    先看一道GIL面试题: 描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因. GIL:又叫全局解 ...

最新文章

  1. 在双系统电脑再安装一个ubuntu18.04
  2. java组长一个月工资多少,保准看明白!
  3. 科大星云诗社动态20211202
  4. html5长按保存,iOS UIWebView仿微信H5页面实现长按保存图片功能
  5. 年轻工程师如何锻炼成高手的
  6. ARM Keil MDK开发STM32工程模板
  7. 双刃剑与灰色地带:“泄露数据收藏家”的素描
  8. MS SQLSERVER 各种乱七八糟
  9. [线段树][树上差分] Jzoj P3397 雨天的尾巴
  10. Build-Docker-Image-from-Zero: 从零构建Docker镜像
  11. java中的mapper是什么_Java使用ObjectMapper的简单示例
  12. 【Head First Java 读书笔记】(四)对象的行为
  13. c语言命名规则 [转载]
  14. 翻译:生产中的机器学习:为什么你应该关心数据和概念漂移
  15. 数学建模国二难不难_【干货】同学听说你想了解数学竞赛和数学建模?文末微积分串讲来袭,拯救你的期中!...
  16. R plot图片背景设置为透明_万能转换:R图和统计表转成发表级的Word、PPT、Excel、HTML、Latex、矢量图等...
  17. [WHS] Windows Home Server 官方中文站点上线
  18. 内边距(padding)
  19. 浅谈数码相机成像中 ISO(感光度)的作用
  20. 阿里巴巴微服务注册中心ConfigServer

热门文章

  1. Android-Activity生命周期
  2. Google的起源故事
  3. 【转载】关于pygame的display
  4. Tun虚拟接口应用总结
  5. 开榨油店的失败教训_这才是真正的开榨油坊的风险!千万不能这么做!
  6. c语言学生管理程序添加,C语言实现学生信息管理程序
  7. java setTimestamp 时间不对
  8. MySQL中的distinct 用法
  9. HTML用div做食逗人,CSS3 吃豆人
  10. 将古老的学问带入科技时代