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

你可能感兴趣的文章
PCA降维demo
查看>>
SharePoint 2013 图文开发系列之定义站点模板
查看>>
PCB生产流程详解-ChatGPT4o作答
查看>>
PCB设计十条黄金法则
查看>>
SpringSecurity框架介绍
查看>>
PCI Express学习篇:Power Management(二)
查看>>
pcie握手机制_【博文连载】PCIe扫盲——Ack/Nak 机制详解(一)
查看>>
pcm转wav的方法及代码示例
查看>>
PC史上最悲剧的16次失败
查看>>
PC端恶意代码分析Lab1.1-5.1,从零基础到精通,收藏这篇就够了!
查看>>
PC端稳定性测试探索
查看>>
PC端编辑 但能在PC端模拟移动端预览的富文本编辑器
查看>>
PDB文件:每个开发人员都必须知道的
查看>>
springMVC学习(二)
查看>>
Pdfkit页眉和页脚
查看>>
PDF中的Pandoc语法突出显示不起作用
查看>>
pdf从结构新建书签_在PDF文件中怎样创建书签
查看>>
pdf做成翻页电子书_第一弹:常见BOOX电子书阅读器问题解答,这些技能你都会吗?...
查看>>
PDF工具箱-分割提取合并
查看>>
pdf打印骑缝章
查看>>