Python实现简易UDP通信程序

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端接收数据
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容