当前位置: 移动技术网 > IT编程>脚本编程>Python > 详解python UDP 编程

详解python UDP 编程

2020年08月25日  | 移动技术网IT编程  | 我要评论
前面我们讲了 tcp 编程,我们知道 tcp 可以建立可靠连接,并且通信双方都可以以流的形式发送数据。本文我们再来介绍另一个常用的协议–udp。相对tcp,udp则是面向无连接的协议。udp 协议我们

前面我们讲了 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 编程的资料请关注移动技术网其它相关文章!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网