UDP简介
UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议与上层协议的接口。UDP协议使用端口分别运行在同一台设备上的多个应用程序。
UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责。常用的UDP端口号有:53(DNS)、69(TFTP)、161(SNMP),使用UDP协议包括:TFTP、SNMP、NFS、DNS、BOOTP。
UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。
Python实现简易UDP程序
UDP server
#!/usr/bin/env python3
# -*- encoding = utf-8 -*-
# 该代码由本人学习时编写,仅供自娱自乐!
# 本人QQ:1945962391
# 欢迎留言讨论,共同学习进步!
from Tools import GET_IP_netifaces
import socket
import sys
import time
localnets = input('请输入需要监听的网卡名称:')
localport = input('请输入需要监听的端口:')
localip = GET_IP_netifaces.get_ip_address(localnets)
ipadress = (localip, int(localport))
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建udp的socket套接字
udp_socket.bind(ipadress) # 绑定ip地址及端口
print('Server端已准备就绪!等待数据传输')
while True:
try:
data, ipaddr = udp_socket.recvfrom(2048)
if not data:
print('客户端程序已退出!服务端即将断开')
time.sleep(1)
break
print('接收来自', ipaddr, '的数据!', '传输内容为:', data)
except KeyboardInterrupt:
print('服务端准备退出!')
time.sleep(1)
sys.exit()
udp_socket.close()
运行效果
server端
UDP client
#!/usr/bin/env python3
# -*- encoding = utf-8 -*-
# 该代码由本人学习时编写,仅供自娱自乐!
# 本人QQ:1945962391
# 欢迎留言讨论,共同学习进步!
import socket
import sys
import time
server_ip = input('请输入需要连接UDP服务端的IP地址:')
server_port = input('请输入需要连接UDP服务端的端口号:')
ipaddress = (server_ip, int(server_port)) # 设置需要连接的服务端地址与端口
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建udp连接
udp_socket.connect(ipaddress) # 连接服务端
while True:
try:
data = input('请输入需要传输的数据:')
if not data: # 如果无数据输入,发送空数据,并退出循环
udp_socket.sendto(data.encode(), ipaddress)
print('无数据输入,程序即将退出!')
time.sleep(1)
break
else: # 否则传输数据,继续循环
udp_socket.sendto(data.encode(), ipaddress)
print('数据传输完毕!')
except KeyboardInterrupt: # 如客户输入ctrl+c,打印提示信息,退出程序
print('用户手动退出程序!')
sys.exit()
udp_socket.close()
运行效果
client
server端接收数据