基于UDP协议的简单套接字
UDP协议 -----> 数据报协议
【一】简单版1.0
【1】TCP协议所遇到的空数据问题是否存在?
TCP协议是水流式协议:传入的数据不能为空,因为水是一直流的,在传输过程中不会对数据进行操作
UDP协议是数据报协议:传入的数据可为空,在传输过程中UDP会对数据进行内部的拼接和处理
- 客户端
# -*-coding: Utf-8 -*-
# @File : 客户端 .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/6/22
import socket
# 建立socket对象
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
# 向服务端发送消息
msg = input('msg:>>>>').strip()
server.sendto(f'{msg}'.encode('utf8'), ('127.0.0.1', 8082))
# 接受服务器返回的消息
data_msg, server_addr = server.recvfrom(1024)
msg_data = data_msg.decode("utf8")
IP = server_addr[0]
PORT = server_addr[1]
print(f'服务端返回拿到的消息:>>>>{data_msg}')
print(f'服务端返回拿到的IP:>>>>{IP}')
print(f'服务端返回拿到的端口:>>>>{PORT}')
# 关闭链接
server.close()
- 服务端
# -*-coding: Utf-8 -*-
# @File : 服务端 .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/6/22
import socket
# 数据报协议 ------> UDP 协议
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 建立链接 ip + 端口
server.bind(('127.0.0.1', 8082))
# 接收到服务端传进来的消息
# 接受收到的 ip 和 端口 对于UDP 来说是非常重要的 因为UDP协议没有建立链接操作
# 返回信息就需要用到拿到的ip和端口
msg_data, clint_addr = server.recvfrom(1024)
msg_data = msg_data.decode("utf8")
IP = clint_addr[0]
PORT = clint_addr[1]
print(f'客户端提供的拿到的消息:>>>>{msg_data}')
print(f'客户端提供的拿到的IP:>>>>{IP}')
print(f'客户端提供的拿到的端口:>>>>{PORT}')
while True:
# 建立链接,返回消息内容
return_msg = msg_data.upper().encode('utf-8')
server.sendto(return_msg, clint_addr)
# 关闭服务
server.close()
【2】TCP协议所遇到的客户端断开链接是否会影响到服务端?
TCP协议是水流式协议:在建立链接过程中,服务端和客户端的链接是一直存在的,断开一方都会对另一方造成影响
UDP协议是数据报协议:在建立链接过程中,是通过解析对方数据中的ip和端口,再向另一方返回数据的,所以一方发生问题并不会影响到另一方
【二】应用
【1】聊天室的创建
- 客户端输入消息
- 将数据上传到服务器
- 服务器解析收到的数据,根据接收到的数据进行返回数据