博客
关于我
基于UDP协议套接字通信的实现
阅读量:291 次
发布时间:2019-03-01

本文共 3358 字,大约阅读时间需要 11 分钟。

基于UDP协议套接字通信的实现

一、UDP实现单用户通信

1. 服务端实现

服务端通过UDP协议接收并处理客户端发送的数据报。注意:UDP是无连接的,服务端和客户端的启动顺序不影响通信。服务端通过bind指定IP地址和端口,接收数据时使用recvfrom获取客户端信息,并通过sendto发送响应数据。

import socketserver = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)server.bind(('127.0.0.1', 8123))while True: data_bytes, client_addr = server.recvfrom(1024) server.sendto(data_bytes.upper(), client_addr) print('数据接收并发送成功')server.close()

2. 客户端实现

客户端通过UDP协议向服务端发送数据报。客户端发送数据时使用sendto指定目标IP地址和端口,接收数据时使用recvfrom获取服务端信息。

import socketclient = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)ip_port = ('127.0.0.1', 8123)while True: msg = input("请输入要发送的消息:").strip() client.sendto(msg.encode("utf-8"), ip_port) data_bytes, server_addr = client.recvfrom(1024) print("收到的数据:", data_bytes.decode("utf-8")) print("发送地址:", server_addr)client.close()

二、UDP协议的无粘包特性

1. 服务端实现

使用UDP协议的服务端可以直接接收和发送完整的数据报,不需要额外处理粘包层。服务端通过recvfrom获取客户端发送的数据以及对应的IP地址和端口。

import socketserver = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)server.bind(('127.0.0.1', 8084))while True: data, client_addr = server.recvfrom(1024) print("收到的数据:", data) print("客户端地址:", client_addr)server.close()

2. 客户端实现

客户端通过UDP协议发送完整的数据报,服务端可以直接接收并处理。客户端发送数据时使用sendto指定目标IP地址和端口。

import socketclient = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)client.sendto('hello'.encode('utf-8'), ('127.0.0.1', 8084))client.sendto('world'.encode('utf-8'), ('127.0.0.1', 8084))client.close()

三、UDP与TCP的区别

1. 连接性

UDP协议是无连接的,客户端和服务端的通信不需要建立连接,任意一方可以随时发送数据。

2. 数据处理方式

UDP协议的数据报包含数据部分和头信息,服务端接收到的数据可能为空,但数据报头仍然有效。因此,服务端可以通过接收数据报的头信息判断是否有有效数据。

3. 数据可靠性

UDP协议不保证数据的可靠传输。如果客户端发送的数据在传输过程中丢失,服务端将无法接收到完整的数据。这种特性使得UDP协议适用于对数据丢失不敏感的场景。

四、案例

1. 基于UDP协议的时间格式化服务器

服务端接收客户端发送的时间格式化字符串,并返回格式化后的时间。

from socket import *from time import strftimeserver = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)server.bind(('127.0.0.1', 8908))print("服务器已启动,等待客户端连接...")while True: msg, addr = server.recvfrom(1024) if not msg: fmt = "%Y-%m-%d %X" else: fmt = msg.decode("utf-8") time_fmt = strftime(fmt) server.sendto(time_fmt.encode("utf-8"), addr)server.close()

客户端实现:from socket import *client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)ip_port = ('127.0.0.1', 8908)while True:inp = input("请输入时间格式(例如:%Y-%m-%d):").strip()client.sendto(inp.encode("utf-8"), ip_port)date = client.recv(1024)print(date.decode("utf-8"))client.close()

2. 基于UDP协议的米聊功能实现

通过UDP协议实现多用户之间的实时聊天,服务端接收客户端的消息并转发给目标用户。

服务端实现:import socketip_port = ('127.0.0.1', 8081)udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)udp_server.bind(ip_port)print("服务器已启动,等待消息...")while True:message, addr = udp_server.recvfrom(1024)print(f"来自[{addr[0]}:{addr[1]}]的消息:{message.decode('utf-8')}")response = input("输入回复消息:").strip()if response:udp_server.sendto(response.encode('utf-8'), addr)else:breakudp_server.close()

客户端实现:import socketudp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)while True:chat_name = input("请选择聊天对象:").strip()while True:message = input("请输入消息,回车发送:").strip()if message == 'quit':breakif not message:continuetarget_ip_port = {"淘小欣": ("127.0.0.1", 8881),"shawn": ("127.0.0.1", 8881),"派大星": ("127.0.0.1", 8881),"派大星的真心话": ("127.0.0.1", 8881)}[chat_name]udp_client.sendto(message.encode('utf-8'), target_ip_port)response, addr = udp_client.recvfrom(1024)print(f"来自[{addr[0]}:{addr[1]}]的回复:{response.decode('utf-8')}")if response:breakif message == 'quit':breakudp_client.close()

转载地址:http://rtto.baihongyu.com/

你可能感兴趣的文章
numpy学习笔记3-array切片
查看>>
numpy数组替换其中的值(如1替换为255)
查看>>
numpy数组索引-ChatGPT4o作答
查看>>
numpy最大值和最大值索引
查看>>
NUMPY矢量化np.prod不能构造具有超过32个操作数的ufunc
查看>>
Numpy矩阵与通用函数
查看>>
numpy绘制热力图
查看>>
numpy转PIL 报错TypeError: Cannot handle this data type
查看>>
Numpy闯关100题,我闯了95关,你呢?
查看>>
nump模块
查看>>
Nutch + solr 这个配合不错哦
查看>>
NuttX 构建系统
查看>>
NutUI:京东风格的轻量级 Vue 组件库
查看>>
NutzCodeInsight 2.0.7 发布,为 nutz-sqltpl 提供友好的 ide 支持
查看>>
NutzWk 5.1.5 发布,Java 微服务分布式开发框架
查看>>
NUUO网络视频录像机 css_parser.php 任意文件读取漏洞复现
查看>>