python UDP网络通信
一、概念
UDP是面向消息的协议,如果通信是不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数据业务,例如:
- 语言广播
- 视频
- TFTP(简单文件传送)
- SNMP(简单网络管理协议)
- RIP(路由信息协议,如报告股票市场、航空信息)
- DNS(域名解析)
和TCP类似,使用UDP的通信双方也分为客户端和服务器。
相关函数:
s = socket.socket(AddressFamily,Type)
函数socket.socket创建一个socket,返回该socket的描述符,该函数带有俩个参数:
- AddressFamily: 可以选择AF_INET(用于Internet进程间通信)或者AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET。
- Type:套接字类型,可以是SOCK_STREAM(流式套接字,主要用于TCP协议)或者SOCK_DGRAM(数据包套接字,主要用于UDP协议)。
例如:创建TCP/IP套接字,如下
tcpsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
创建UDP/IP套接字,如下
udpsocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
创建完成后,生成一个socket对象,socket对象的主要方法如下表所示:
socket对象的内置方法
函数 | 描述 |
---|---|
s.bind() | 绑定地址(host,port)到套接字,在AF_INET下,以元组(host,port)的形式表示地址 |
s.listen() | 开始TCP监听。在backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分程序设置为5就可以了 |
s.accept() | 被动接收TCP客户端连接(阻塞式),等待连接的到来 |
s.connect() | 主动初始化TCP服务器连接,一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误 |
s.recv() | 接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略 |
s.send() | 发送TCP数据,将string中的数据发送到连接的套接字。返回值是发送的字节数量,该数量可能小于string的字节大小 |
s.sendall() | 完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败抛出异常 |
s.recvfrom | 接收UDP数据,与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址 |
s.sendto() | 发送UDP数据,将数据发送到套接字,address是形式为(ipaddr,port)的元祖,指定远程地址。返回值是发送的字节数 |
s.close() | 关闭套接字 |
二、创建UDP服务器 udp_server.py
#1.创建UDP套接字
#2.绑定地址(host,port)到套接字 s.bind()
#3.收发数据 s.recvfrom() s.sendto()
#4.关闭服务器端套接字 s.close()
import socket
#1.创建UDP套接字
#2.绑定地址(host,port)到套接字 s.bind()
#3.收发数据 s.recvfrom() s.sendto()
#4.关闭服务器端套接字 s.close()
s= socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
host="192.168.1.112"
port=1000
s.bind((host,port)) #绑定地址(host,port)到套接字
#接收客户端传过来的数据
data,addr= s.recvfrom(1024) #data是接收到的数据 addr是对方的地址 也就是发送方的地址#print(type(data))print("收到的数据为:",str(data))#print("addr",addr)
send_data=input("请输入要发送到客户端的数据:\n")
s.sendto(send_data.encode("gbk"),addr)
s.close()
三、创建UDP客户端 udp_client.py
#1.创建客户端套接字
#2.发送/接收数据
#3.关闭套接字
#1.创建客户端套接字
#2.发送/接收数据
#3.关闭套接字
import socket
#1.创建客户端套接字
s= socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#2.发送/接收数据
send_data=input("请输入要发送给服务器的数据:\n")
s.sendto(send_data.encode("gbk"),("192.168.1.112",1000))print("收到的数据为:",s.recv(1024).decode("gbk"))
s.close()
运行代码时同时打开俩个cmd,先运行服务器端(udp_server.py)代码,在运行客户端(udp_client.py)代码
运行结果如下: