1.网络-UDP
1.1 UDP简介
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
可以简单的理解为写信,流程比较简单
优点:无连接、快速传输
缺点:不太可靠
1.2 工作流程
- 创建UDP套接字
- 编辑发送内容
- 关闭UDPT套接字
1.3 socket模块中涉及关键字
关键字 | 基本作用 |
s.AF_INET | 协议族:支持Windows、linux、Unix |
S.SOCK_DGRAM | 通讯类型:数字报,对应UDP协议 |
S.bind() | 为套接字绑定一个端口 |
s.sendto() | 发送信息 |
s.recvfrom() | 接收信息 |
s.close | 关闭套接字 |
1.4代码实战
例一:发送数据
需求:利用网络通信助手,编写一个python程序使其发送信息
提示:既然要发送数据,正如发短信一样,必须要知道对方电话号码。
UDP发送数据必须要知道接收方的IP和端口号。
import socket
def main()
# 1.创建一个套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 2.发送数据
send_date = input("请输入要发送内容:")
udp_socket.sendto(send_date.encode("utf-8"),("192,168,0,2",9876))
#3.关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()
例二:循环发送数据
需求:继续上述要求,实现UDP套接字的循环发送信息
提示:使用 while Ture循环
import socket
def main()
# 1.创建一个套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 2.循环发送数据
while True:
send_date = input("请输入要发送内容:")
# 输入 exit 退出循环
if send_date == "exit":
break
udp_socket.sendto(send_date.encode("utf-8"),("192,168,0,2",9876))
#3.关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()
例三:接收数据
需求:接收对方的数据
提示:正如发送数据一样,接收数据必须要绑定自己的端口和IP
import socket
def main()
# 1.创建一个套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 2.绑定本地信息
load_addr = ("192.168.0.2",9876)
udp_socket.bind(load_addr)
# 3.接收数据
reve_date = udp_socket.recvfrom(1024)
# reve_date 返回的值是一个元祖,可以拆包显示(收到数据、发送方IP和端口)
reve_msg = reve_date[0] # 储存收到数据
send_arr = reve_date[1] # 储存发送方信息
# 4.显示数据
print("%s: %S" % str(send_arr),reve_date.decode("utf-8"))
# 5.关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()
注意:
用户返回的数据是一个元祖,(接收到的数据,发送方信息(发送方的IP,端口号))
例四:使用同一个套接字收发数据
import socket
def main():
# 创建一个套接字
udp_socket =socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 获取对方的ip以及端口port
dest_ip = input("请输入对方ip地址:")
dest_port = int(input("请输入对方端口号:"))
# 从键盘获取数据
send_date = input("请输入要发送的数据")
# 使用套接字发送数据
udp_socket.sendto(send_date.encode("utf-8"),(dest_ip,dest_port))
# 接收发送过来的数据 (套接字可以同时收发数据)
recive_date = udp_socket.recvfrom(1024)
print(recive_date)
# 关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()