UDP适用于对效率要求相对较高而对准确性要求相对较低的场合,例如视频在线点播、网络语音通话等等。 socket模块中经常用于UDP编程的方法主要有:
socket([family[,type[,proto]]]):创建一个socket对象,其中family为socket.AF_INET表示IPV4,socket.AF_INET6表示IPV6;type为SOCK_STREAM表示TCP协议,SOCK_DGRAM表示UDP协议。
sendto(string,address):把string指定的字节串内容发送给address指定的地址,address是一个元组,格式为(IP地址,端口号)
recvfrom(bufsize[,flags]):接收数据
例9-1 编写UDP通信程序,发送端发送一个字符串“Hello world!”。接收端在计算机的5000端口进行接收,并显示接收内容,如果收到字符串bye(忽略大小写)则结束监听。
接收端代码receiver.py:
1 import socket 2 # 使用IPV4协议,使用UDP协议传输数据 3 s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 4 # 绑定端口和端口号,空字符串表示本机任何可用IP地址 5 s.bind(('', 5000)) 6 while True: 7 data, addr = s.recvfrom(1024) 8 # 显示接收到的内容 9 data = data.decode() 10 print('received message:{0} from PORT {1[1]} on {1[0]}'.format(data, addr)) 11 if data.lower() == 'bye': 12 break 13 s.close( )
发送端代码sender.py:
import socket import sys s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 假设192.168.0.103是接收端机器的IP地址 s.sendto(sys.argv[1].encode() , ("192.168.1.105" ,5000)) s.close()
***首先启动一个命令提示符环境并运行接收端程序,这时接收端程序处于阻塞状态,接下来再启动一个新的命令提示符环境并运行发送端程序,此时会看到接收端程序继续运行并显示接收到的内容以及发送端程序所在计算机IP地址和占用的端口号。
***当发送端发送字符串bye后,接收端程序结束,此后再次运行发送端程序时接收端没有任何反应,但发送端程序也并不报错。这正是UDP协议的特点,即“尽最大努力传输”,并不保证非常好的服务质量。
运行效果: