<1>UDP含义:
英文全拼(User Datagram Protocol)简称用户数据报协议,它是无连接的、不可靠的网络传输协议
<2>UDP特点:
无连接、资源开销小(udp每个数据包最大是64K)、传输速度快、没有超时重发机制。
<3>UDP的优缺点:
(1)优点:传输速度快、不需要连接,资源开销小
(2)缺点:传输数据不可靠,容易丢数据包、没有流量控制。(当对方没有及时接收数据,发送方一直发送数据会导致缓冲区数据满了,电脑出现卡死情况,所有接收方需要及时接收数据。)
<4>socket介绍
1、socket的概念:
(套接字)不同进程之间进行通信的工具,将数据从一方传到另一方,完成数据传输
2、udp网络程序流程
(1)创建客户端套接字 import socket —> soc = socket.socket(AddressFamily, Type)
1、Address Family:IP地址类型; AF_INET表示ipv4类型、AF_INET6表示ipv6类型;
2、Type:套接字类型,可以是 SOCK_STREAM(TCP 协议)或者 SOCK_DGRAM(用UDP 协议)
(2)发送/接收数据
1、发送数据 soc.sendto(send_data,(ip,port))
2、收发数据 soc.recvfrom(1024) ps:1024表示本次接收的最大字节数。
3、Windows使用的是gbk编码
4、Linux使用的是utf-8编码
说明:一个udp网络程序,不绑定端口号,此时操作系统会随机分配一个端口号,如果绑定端口号,每次启动程序端口号不变。如果需要做成一个服务器端的程序的话,是需要绑定的
(3)关闭套接字 soc.close()
3、数据编码和解码
(1)str->bytes:encode编码 str.encode(encoding=“utf-8”, errors=“strict”)
(2)bytes->str:decode解码 bytes.decode(encoding=“utf-8”, errors=“strict”)
说明:
1> strict:表示严格按照指定编解码方式进行编码和解码,如果编解码不成功则崩溃
2> ignore:表示忽略编解码不成功的字符,如果编解码不成功程序不会崩溃
4、UDP发送广播消息
(1)广播地址最常用的是255.255.255.255
(2)设置socket的选项,允许发送广播消息:
格式:udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
说明:
1> socket.SOL_SOCKET -> 表示当前套接字
2> socket.SO_BROADCAST -> 表示套接字广播选项
*<5>udp网络程序-发送、接收数据——示例代码
import socket
# 1. 创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2. 准备接收方的地址
dest_addr = ('192.168.236.129', 8080)
# 3. 从键盘获取数据
send_data = input("请输入要发送的数据:")
# 4. 发送数据到指定的电脑上
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
# 5. 等待接收对方发送的数据
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数
# 6. 显示对方发送的数据
# 接收到的数据recv_data是一个元组
# 第1个元素是对方发送的数据
# 第2个元素是对方的ip和端口
print(recv_data[0].decode('gbk'))
print(recv_data[1])
# 7. 关闭套接字
udp_socket.close()
<6>发送广播消息——示例代码
import socket
if __name__ == '__main__':
# 创建udpsocket
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 设置socket的选项,允许发送广播消息
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
# 发送广播消息
udp_socket.sendto("大家好,我叫小郭同学,多多关照!".encode("gbk"), ("255.255.255.255", 9090))
# 关闭socket
udp_socket.close()
<7>udp聊天器——示例代码
import socket
def send_msg(udp_socket):
"""获取键盘数据,并将其发送给对方"""
# 1. 从键盘输入数据
msg = input("\n请输入要发送的数据:")
# 2. 输入对方的ip地址
dest_ip = input("\n请输入对方的ip地址:")
# 3. 输入对方的port
dest_port = int(input("\n请输入对方的port:"))
# 4. 发送数据
udp_socket.sendto(msg.encode("utf-8"), (dest_ip, dest_port))
def recv_msg(udp_socket):
"""接收数据并显示"""
# 1. 接收数据
recv_msg = udp_socket.recvfrom(1024)
# 2. 解码
recv_ip = recv_msg[1]
recv_msg = recv_msg[0].decode("utf-8")
# 3. 显示接收到的数据
print(">>>%s:%s" % (str(recv_ip), recv_msg))
def main():
# 1. 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2. 绑定本地信息
udp_socket.bind(("", 7890))
while True:
# 3. 选择功能
print("="*30)
print("1:发送消息")
print("2:接收消息")
print("="*30)
op_num = input("请输入要操作的功能序号:")
# 4. 根据选择调用相应的函数
if op_num == "1":
send_msg(udp_socket)
elif op_num == "2":
recv_msg(udp_socket)
else:
print("输入有误,请重新输入...")
if __name__ == "__main__":
main()