UDP(User Datagram Protocol,用户数据报协议)是一种无连接、不可靠、基于数据报的传输层通信协议。
UDP 的通信过程与 TCP 相比较为简单,不需要复杂的三次握手与四次挥手,体现了无连接。
UDP 传输速度比 TCP 快,但容易丢包、数据到达顺序无保证、缺乏拥塞控制、秉承尽最大努力交付的原则,体现了不可靠。
使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。
一、 udp网络程序-发送数据
图片.png代码如下:
#coding=utf-8
import socket
def main():
while True:
# 创建一个udp套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 使用套接字收发数据
# 对方的ip以及port
# dest_address =
send_data = input("请输入要发送的数据:")
if send_data == "exit":
break
udp_socket.sendto(send_data.encode("utf-8",errors="strict"), ("192.168.140.154", 7788))
# 关闭套接字
udp_socket.close()
if __name__ == '__main__':
main()
代码写好了,验证很关键,则需安装socket调试工具(针对mac端)
安装方法:
- 首先安装brew工具,命令行输入
/usr/bin/ruby -e "$(curl -fsSL [https://raw.githubusercontent.com/Homebrew/install/master/install](https://raw.githubusercontent.com/Homebrew/install/master/install))"
- 安装saka仓库
brew tap rangaofei/saka
- 然后安装软件
brew install sokit
- 因为要依赖qt,所以安装会稍微慢一点,安装成功后执行命令即可:
sokit
注意:
第1, 3安装会稍微慢一点,请耐心等待。
启动之后便会出现
图片.png
二、 udp网络程序-接收数据
import socket
def main():
# 1.创建套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 2. 绑定一个本地信息
udp_socket.bind(("",7788))
# 3. 接收数据
recv_data = udp_socket.recvfrom(1024) # # 1024表示本次接收的最大字节数
# 4. 打印接收到的数据
print(recv_data)
# 5. 关闭套接字
udp_socket.close()
if __name__ == '__main__':
main()
图片.png
此时就可以看到控制台里面打印
图片.png
三、 案例——udp聊天器
import socket
def send_msg(udp_socket):
# 发送
dest_ip = input("请输入对方的IP:")
dest_port = int(input("请输入对方的port:"))
send_data = input("请输入要发送的数据:")
udp_socket.sendto(send_data.encode("utf-8"), (dest_ip, dest_port))
def recv_msg(udp_socket):
# 接收并显示
recv_data = udp_socket.recvfrom(1024)
print("%s:%s" % (str(recv_data[1]), recv_data[0].decode("utf-8")))
def main():
# 创建套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 绑定信息
udp_socket.bind(("", 8833))
# 循环来出来进行处理事情
while True:
print("1:发送消息\n2:接收消息")
input_str = input("请输入选择的功能:")
if input_str == "1":
# 发送数据
send_msg(udp_socket)
elif input_str == "2":
# 接收数据
recv_msg(udp_socket)
elif input_str == "0":
# 退出程序
break
else:
print("请输入正确的功能")
# 关闭套接字
udp_socket.close()
if __name__ == '__main__':
main()
图片.png
小结
网友评论