@(网络编程)
1.UDP是什么
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法。RFC 768 [1] 描述了 UDP。
Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的的事情。面向连接的是 TCP,该协议几乎做了所有的事情
2.代码实现
发送端
import socket def main(): #创建一个udp套接字 udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #如果没有绑定,故接收端只有随机端口接收 udp_socket.bind(("",7789)) while True: #获取数据 send_data = input("请输入要发送的数据") if send_data == "exit": break #ip,port address = ("127.0.0.1",7788) #可以使用套接字收发数据 第一个参数必须为二进制数据 第二个参数是一个元组(ip,port) # udp_socket.sendto(b"hahaha",address) udp_socket.sendto(send_data.encode("utf-8"),address) #关闭 udp_socket.close() if __name__ == '__main__': #发送服务器启动 main()
接收端
import socket def main(): # 创建一个udp套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定本地的相关信息,如果一个网络程序不绑定,系统会随机分配 address = ("127.0.0.1", 7788) udp_socket.bind(address) for i in range(0,100): #等待接收对方发送的数据 1024表示的是每一次接收的最大字节数 recv_data = udp_socket.recvfrom(1024) recv_mess = recv_data[0] send_addre = recv_data[1] print(recv_mess.decode("utf-8"),str(send_addre))#recv_mess.decode("utf-8") # 关闭 udp_socket.close() if __name__ == '__main__': print("接收服务器启动") main()
注意
- 接收端必须绑定端口和ip地址
- 发送端可以不绑定,此时主机会分配一个随机的端口
- 发送端发送的数据要进行编码,对应的接收端要进行解码
- recvfrom后面接的是字节数
- recvfrom返回的数据是一个列表挥着元组,其中0为接收的数据,1为发送人的地址