博客
关于我
基于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/

你可能感兴趣的文章
OpenCV读写avi、mpeg文件
查看>>
opencv里用calcCovarMatrix计算协方差矩阵
查看>>
OpenCV错误:在setSize中断言失败(s&>;=0)-尝试将图像放置在网络摄像头提要上时
查看>>
opencv面向对象设计初探
查看>>
OpenCV(1)读写图像
查看>>
OpenCV:不规则形状区域中每种颜色的像素数?
查看>>
OpenCV:概念、历史、应用场景示例、核心模块、安装配置
查看>>
OpenDaylight融合OpenStack架构分析
查看>>
OpenERP ORM 对象方法列表
查看>>
openEuler Summit 2022 成功举行,开启全场景创新新时代
查看>>
openEuler 正式开放:推动计算多样化时代的到来
查看>>
OpenEuler23.03欧拉系统_安装瀚高数据库企业版6.0.4_openeuler切换root用户_su:拒绝权限_passwd: 鉴定令牌操作错误---国产瀚高数据库工作笔记001
查看>>
OpenEuler23.03欧拉系统_安装瀚高数据库企业版6.0.4_踩坑_安装以后系统无法联网_启动ens33网卡---国产瀚高数据库工作笔记002
查看>>
OpenFeign 入门与实战
查看>>
OpenFeign源码学习
查看>>
OpenFeign组件声明式服务调用
查看>>
openfeign远程调用不起作用解决_使用Spring Boot的spring.factories进行注入---SpringCloud Alibaba_若依微服务框架改造---工作笔记007
查看>>
openfire开发(四)消息拦截器
查看>>
openfire源码解读之将cache和session对象移入redis以提升性能
查看>>
Openfire身份认证绕过漏洞复现+利用(CVE-2023-32315)
查看>>