# 使用自换接口的UDP服务器和客户端 # UDP client and server on localhost # 本地主机上的UDP客户端和服务器 import sys import argparse #命令行选项与参数解析 import socket #套接字 from datetime import datetime #日期时间模块的日期时间函数 import sys MAX_BYTES = 65535 def server(port): #定义一个服务器函数 入口 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建了一个空套接字 并 标记了所属的特定类别:协议族AF_INET,与数据报类型SOCK_DGRAM(数据报datagram,不是数据包(packet)。 sock.bind(('127.0.0.1', port)) # bind()命令请求绑定一个UDP网络地址,有简单的python二元组构成,包含了一个ip和一个整型的UDP端口号。如果被占用将报错。[errno98] print('Listening at {}'.format(sock.getsockname())) # 打印出目前套接字绑定到的IP地址以及端口。通过socket 函数的getsockname()方法,获取包含此信息的二元组 while True: # 套接字绑定成功后,服务器循环接受请求! data, address = sock.recvfrom(MAX_BYTES) #不断的运行recvfrom(),一旦接受到一个数据报 recvfrom()就会返回两个值。# 第一个是发送该数据报的客户端地址,第二个是以字节表示的数据报内容。 #recvfrom(MAX_BYTES)表示可接受最长为65535字节的信息(这也是一个UDP数据报可以包含的最大长度), #data(数据) address(地址) text = data.decode('ascii') #data用ascii解码 直接将字节转化为字符串 print('The client at {} says {!r}'.format(address, text)) #在客户端输出# 客户端在address(地址) 说text(文本) text = 'Your data was {} bytes long'.format(len(data)) #打印数据长度 data = text.encode('ascii') sock.sendto(data, address) #发送到 def client(port): sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) text = 'The time is {}'.format(datetime.now()) data = text.encode('ascii') # data用ascii解码 sock.sendto(data, ('127.0.0.1' , port)) print('The OS assigned me the address {}'.format(sock.getsockname())) data, address = sock.recvfrom(MAX_BYTES) #danger text = data.decode('ascii') print('The server {} replied {!r}'.format(address, text)) if __name__ == '__main__' : choices = {'client': client, 'server': server} parser = argparse.ArgumentParser(description='Send and receive UDP locally') #创建对象 括号里面是描述说明 parser.add_argument('role', choices=choices, help='which role to play') # 函数add_argumen()第一个是选项,第二个是数据类型,第三个默认值,第四个是help命令时的说明 parser.add_argument('-p', metavar='PORT', type=int, default=1060, help='UDP port (default 1060)') args = parser.parse_args() #解析参数 function = choices[args.role] function(args.p) #在CMD中运行 python UDP2.2.py server python UDP2.2.py client
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术