(2)基于UDP协议的简单套接字

发布时间 2023-06-23 17:29:45作者: Chimengmeng

基于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】聊天室的创建

  • 客户端输入消息
    • 将数据上传到服务器
  • 服务器解析收到的数据,根据接收到的数据进行返回数据