Python网络与多任务编程:TCP/UDP实战指南

Python网络与多任务编程:TCP/UDP实战指南

一、网络编程

1.1 前言

网络编程是现代软件开发中不可或缺的一部分,它使得不同设备之间的数据交换成为可能。Python提供了强大的标准库来支持各种网络编程需求。

1.1.1 IP地址简介

IP地址是互联网上设备的唯一标识符,分为IPv4和IPv6两种格式:

import socket# 获取本机IP地址
hostname = socket.gethostname()
ip_address = socket.gethostbyname(hostname)
print(f"主机名: {hostname}")
print(f"IP地址: {ip_address}")# 域名解析
domain = "www.google.com"
try:ip = socket.gethostbyname(domain)print(f"{domain} 的IP地址是: {ip}")
except socket.gaierror:print(f"无法解析域名: {domain}")
1.1.2 端口和端口号简介

端口是网络通信的端点,端口号范围是0-65535,其中0-1023为知名端口,一般由系统服务使用。

# 常见端口号示例
common_ports = {"HTTP": 80,"HTTPS": 443,"FTP": 21,"SSH": 22,"SMTP": 25,"DNS": 53
}print("常见服务端口号:")
for service, port in common_ports.items():print(f"{service}: {port}")
1.1.3 字符串数据编解码

网络传输中数据需要以字节形式传输,因此需要进行编解码操作:

# 字符串编码与解码
text = "你好,世界!"# 编码为字节
encoded_data = text.encode('utf-8')
print(f"编码后: {encoded_data}")# 解码为字符串
decoded_text = encoded_data.decode('utf-8')
print(f"解码后: {decoded_text}")# 其他编码方式
text_gbk = text.encode('gbk')
print(f"GBK编码: {text_gbk}")

1.2 TCP

1.2.1 TCP介绍

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它提供全双工通信,确保数据顺序传输且不丢失。

1.2.2 TCP客户端开发
1.2.2.1 发送数据
import socketdef tcp_client_send(host='127.0.0.1', port=8888):"""TCP客户端发送数据"""# 创建TCP socketclient_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:# 连接服务器client_socket.connect((host, port))print(f"已连接到服务器 {host}:{port}")# 发送数据message = "Hello, TCP Server!"client_socket.send(message.encode('utf-8'))print(f"已发送: {message}")except Exception as e:print(f"连接错误: {e}")finally:# 关闭连接client_socket.close()print("连接已关闭")if __name__ == "__main__":tcp_client_send()
1.2.2.2 发送并接收数据
def tcp_client_send_receive(host='127.0.0.1', port=8888):"""TCP客户端发送并接收数据"""client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)try:client_socket.connect((host, port))print(f"已连接到服务器 {host}:{port}")# 发送数据message = "Hello, Server! How are you?"client_socket.send(message.encode('utf-8'))print(f"已发送: {message}")# 接收响应response = client_socket.recv(1024).decode('utf-8')print(f"收到响应: {response}")except Exception as e:print(f"错误: {e}")finally:client_socket.close()print("连接已关闭")if __name__ == "__main__":tcp_client_send_receive()
1.2.3 TCP服务器开发
1.2.3.1 接收客户端消息并回复
def tcp_server_simple(host='127.0.0.1', port=8888):"""简单的TCP服务器,接收消息并回复"""# 创建TCP socketserver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置地址重用server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 绑定地址和端口server_socket.bind((host, port))# 开始监听,设置最大连接数server_socket.listen(5)print(f"服务器启动,监听 {host}:{port}")try:while True:# 接受客户端连接client_socket, client_address = server_socket.accept()print(f"接收到来自 {client_address} 的连接")try:# 接收客户端数据data = client_socket.recv(1024).decode('utf-8')if data:print(f"收到消息: {data}")# 回复客户端response = f"服务器已收到你的消息: {data}"client_socket.send(response.encode('utf-8'))except Exception as e:print(f"处理客户端数据时出错: {e}")finally:# 关闭客户端连接client_socket.close()print(f"与 {client_address} 的连接已关闭")except KeyboardInterrupt:print("服务器被用户中断")finally:# 关闭服务器socketserver_socket.close()print("服务器已关闭")if __name__ == "__main__":tcp_server_simple()
1.2.3.2 接收客户端的多条信息
def tcp_server_multiple_messages(host='127.0.0.1', port=8888):"""处理客户端多条消息的TCP服务器"""server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)server_socket.bind((host, port))server_socket.listen(5)print(f"服务器启动,监听 {host}:{port}")try:while True:client_socket, client_address = server_socket.accept()print(f"接收到来自 {client_address} 的连接")try:# 持续接收客户端消息while True:data = client_socket.recv(1024).decode('utf-8')if not data:print(f"{client_address} 断开连接")breakprint(f"收到来自 {client_address} 的消息: {data}")# 处理特殊命令if data.lower() == 'exit':response = "再见!"client_socket.send(response.encode('utf-8'))breakelif data.lower() == 'time':from datetime import datetimeresponse = f"当前时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"client_socket.send(response.encode('utf-8'))else:response = f"已收到: {data}"client_socket.send(response.encode('utf-8'))except ConnectionResetError:print(f"{client_address} 异常断开连接")except Exception as e:print(f"处理 {client_address} 时出错: {e}")finally:client_socket.close()except KeyboardInterrupt:print("服务器被用户中断")finally:server_socket.close()print("服务器已关闭")if __name__ == "__main__":tcp_server_multiple_messages()
1.2.3.3 允许客户端多次连接
import threadingdef handle_client(client_socket, client_address):"""处理客户端连接的线程函数"""print(f"开始处理 {client_address} 的连接")try:while True:data = client_socket.recv(1024).decode('utf-8')if not data:print(f"{client_address} 断开连接")breakprint(f"收到来自 {client_address} 的消息: {data}")# 回复客户端response = f"服务器已收到: {data}"client_socket.send(response.encode('utf-8'))except ConnectionResetError:print(f"{client_address} 异常断开连接")except Exception as e:print(f"处理 {client_address} 时出错: {e}")finally:client_socket.close()print(f"{client_address} 的连接已关闭")def tcp_server_multiple_clients(host='127.0.0.1', port=8888):"""支持多客户端连接的TCP服务器"""server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)server_socket.bind((host, port))server_socket.listen(5)print(f"服务器启动,监听 {host}:{port}")try:while True:client_socket, client_address = server_socket.accept()print(f"接收到来自 {client_address} 的连接")# 为每个客户端创建新线程client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))client_thread.daemon = Trueclient_thread.start()except KeyboardInterrupt:print("服务器被用户中断")finally:server_socket.close()print("服务器已关闭")if __name__ == "__main__":tcp_server_multiple_clients()
1.2.4 TCP开发总结
  1. TCP特点:面向连接、可靠传输、流量控制、拥塞控制
  2. 适用场景:需要可靠数据传输的应用,如文件传输、邮件、Web浏览
  3. 开发要点
    • 客户端使用connect()连接服务器
    • 服务器使用bind()绑定地址,listen()监听,accept()接受连接
    • 使用send()和recv()进行数据传输
    • 及时关闭连接释放资源
    • 处理异常和连接中断情况

1.3 UDP

1.3.1 UDP介绍

UDP(用户数据报协议)是一种无连接的传输层协议,提供不可靠的数据报服务。它不保证数据顺序和可靠性,但传输效率高。

1.3.2 UDP发送端开发
def udp_sender(host='127.0.0.1', port=9999):"""UDP发送端"""# 创建UDP socketudp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)try:while True:# 获取用户输入message = input("请输入要发送的消息 (输入 'exit' 退出): ")if message.lower() == 'exit':break# 发送数据udp_socket.sendto(message.encode('utf-8'), (host, port))print(f"已发送到 {host}:{port}: {message}")except Exception as e:print(f"发送错误: {e}")finally:udp_socket.close()print("UDP发送端已关闭")if __name__ == "__main__":udp_sender()
1.3.3 UDP接收端开发
def udp_receiver(host='127.0.0.1', port=9999):"""UDP接收端"""# 创建UDP socketudp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定地址和端口udp_socket.bind((host, port))print(f"UDP接收端启动,监听 {host}:{port}")try:while True:# 接收数据data, addr = udp_socket.recvfrom(1024)message = data.decode('utf-8')print(f"收到来自 {addr} 的消息: {message}")# 可选:发送回复if message.lower() == 'hello':reply = "Hello from UDP Receiver!"udp_socket.sendto(reply.encode('utf-8'), addr)except KeyboardInterrupt:print("接收端被用户中断")except Exception as e:print(f"接收错误: {e}")finally:udp_socket.close()print("UDP接收端已关闭")if __name__ == "__main__":udp_receiver()
1.3.4 UDP广播
def udp_broadcast_sender(port=9999):"""UDP广播发送端"""# 创建UDP socketudp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 设置广播选项udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)# 广播地址broadcast_address = '<broadcast>'try:while True:# 获取用户输入message = input("请输入广播消息 (输入 'exit' 退出): ")if message.lower() == 'exit':break# 发送广播udp_socket.sendto(message.encode('utf-8'), (broadcast_address, port))print(f"已广播: {message}")except Exception as e:print(f"广播错误: {e}")finally:udp_socket.close()print("广播发送端已关闭")def udp_broadcast_receiver(port=9999):"""UDP广播接收端"""udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定到所有接口udp_socket.bind(('', port))print(f"广播接收端启动,监听端口 {port}")try:while True:data, addr = udp_socket.recvfrom(1024)message = data.decode('utf-8')print(f"收到来自 {addr} 的广播: {message}")except KeyboardInterrupt:print("广播接收端被用户中断")except Exception as e:print(f"接收错误: {e}")finally:udp_socket.close()print("广播接收端已关闭")if __name__ == "__main__":# 需要在不同终端运行接收端和发送端import sysif len(sys.argv) > 1 and sys.argv[1] == 'receiver':udp_broadcast_receiver()else:udp_broadcast_sender()

二、多任务编程

多任务编程允许程序同时执行多个任务,提高程序效率和响应性。Python中主要通过多线程和多进程实现。

2.1 多线程编程

import threading
import timedef worker(name, delay):"""简单的 worker 函数"""print(f"线程 {name} 开始执行")time.sleep(delay)print(f"线程 {name} 执行完成,延迟 {delay} 秒")# 创建多个线程
threads = []
for i in range(5):t = threading.Thread(target=worker, args=(f"Thread-{i}", i))threads.append(t)t.start()# 等待所有线程完成
for t in threads:t.join()print("所有线程执行完成")

2.2 线程同步

import threading# 使用锁进行同步
counter = 0
lock = threading.Lock()def increment_counter():global counterfor _ in range(100000):with lock:  # 使用上下文管理器自动获取和释放锁counter += 1# 创建多个线程增加计数器
threads = []
for _ in range(10):t = threading.Thread(target=increment_counter)threads.append(t)t.start()for t in threads:t.join()print(f"最终计数器值: {counter} (应为 1000000)")

2.3 多进程编程

import multiprocessing
import timedef cpu_intensive_task(n):"""CPU密集型任务"""result = 0for i in range(n):result += i * ireturn resultif __name__ == "__main__":# 创建进程池with multiprocessing.Pool(processes=4) as pool:# 并行执行任务results = pool.map(cpu_intensive_task, [10000000] * 8)print(f"计算结果: {results}")

总结

本文介绍了Python网络编程和多任务编程的基础知识:

  1. 网络编程基础:IP地址、端口和编解码
  2. TCP编程:面向连接的可靠通信,适合需要数据完整性的场景
  3. UDP编程:无连接的快速通信,适合实时性要求高的场景
  4. 多任务编程:通过多线程和多进程提高程序效率

掌握这些知识后,你可以开发各种网络应用,从简单的客户端/服务器程序到复杂的分布式系统。在实际开发中,根据需求选择合适的协议和并发模型至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96809.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android8 binder源码学习分析笔记(四)——ServiceManager启动

前文回顾&#xff1a; Android8 binder源码学习分析笔记&#xff08;三&#xff09;&#xff1a; https://blog.csdn.net/g_i_a_o_giao/article/details/151365630?spm1001.2014.3001.5502 Android8 binder源码学习分析笔记&#xff08;二&#xff09;&#xff1a; https://…

Redis 大 Key 与热 Key:生产环境的风险与解决方案

&#x1f525; Redis 大 Key 与热 Key&#xff1a;生产环境的风险与解决方案 文章目录&#x1f525; Redis 大 Key 与热 Key&#xff1a;生产环境的风险与解决方案&#x1f9e0; 一、问题定义与识别&#x1f4a1; 什么是大 Key&#xff1f;&#x1f525; 什么是热 Key&#xff…

C++算法题中的输入输出形式(I/O)

本文主要帮助刷leetcode题型快速适应完整带输入输出的题&#xff08;机试、考试、比赛等&#xff09;接收能用cin就用cin 。cin 自动分割单词 的特性&#xff08;cin 读取字符串时会自动跳过空格 / 换行&#xff0c;将连续非空格字符作为一个 “单词”&#xff09;一、单组输入…

【左程云算法09】栈的入门题目-最小栈

目录 栈的入门题目-最小栈 代码演示 视频链接 算法讲解015【入门】栈的入门题目-最小栈 Leecode155 栈的入门题目-最小栈 实现一个getmin方法&#xff08;高效方法&#xff0c;即不用遍历&#xff09;&#xff0c;希望能实现O&#xff08;1&#xff09; 做法&#xff1a…

Grafana与Prometheus实战

&#x1f31f;Grafana的Dashboard的权限管理 创建团队 创建用户 设置团队权限 &#x1f31f;Prometheus启用https及认证功能 自建ca的证书 准备证书目录 mkdir /app/tools/prometheus-2.53.4.linux-amd64/certs cd /app/tools/prometheus-2.53.4.linux-amd64/certs生成ca的…

FPGA交通灯设计报告(源码+管脚约束+实物图+设计报告)

基于FPGA的交通灯设计 摘要 本设计采用FPGA技术实现了一个智能交通灯控制系统。系统以Verilog HDL为设计语言,在FPGA平台上实现了交通灯的自动控制、数码管倒计时显示、紧急情况处理等功能。通过合理的状态机设计和模块化编程,系统具有良好的实时性、可靠性和可扩展性,能够…

技术论文分析分析论文《计算机病毒判定专家系统原理与设计》思考其在游戏中的应用

论文原文的引言主要有两大部分的内容&#xff1a;介绍计算机病毒&#xff0c;明确本文使用的病毒分类方式&#xff1b;分析传统计算机病毒检测存在的弊端。对于计算机病毒的定义&#xff0c;文中给出的定义比较严谨&#xff0c;我自己查了一下现在百度百科的定义&#xff0c;两…

《Unity项目实战:动态加载引发的显存危机全链路排查与重构实践》

从动态光影那流光溢彩、仿佛赋予虚拟世界真实质感的绚丽效果—这得益于Unity引擎强大的HDRP管线对光照路径的精准模拟,到物理引擎驱动的物体碰撞精准到毫厘的物理反馈—依托Unity Physics模块对刚体动力学的毫秒级计算,再到能够依据不同设备性能自动适配的画质表现—通过Unit…

智慧水库综合管理系统平台御控物联网解决方案

一、行业背景与痛点分析水库作为防洪、灌溉、供水、发电及生态保护的核心基础设施&#xff0c;其管理效率直接关系到区域水资源安全与可持续发展。然而&#xff0c;传统水库管理模式存在四大核心痛点&#xff1a;数据孤岛严重&#xff1a;水位、雨量、水质、设备状态等数据分散…

使用nvm安装Node.js18以下报错解决方案——The system cannot find the file specified.

使用 nvm 安装 Node.js 18以下 报错解决方案 在前端开发过程中&#xff0c;常常需要针对不同项目切换 Node.js 版本。nvm&#xff08;Node Version Manager&#xff09;是最常用的工具。但最近在尝试安装 Node.js 14 版本时&#xff0c;遇到了奇怪的错误。 问题描述 使用 nv…

在Excel和WPS表格中快速复制上一行内容

有的时候我们在Excel和WPS表格中想复制上一行对应单元格、连续区域或整行的内容&#xff0c;只需要在当前行拖动鼠标左键选中相关区域&#xff0c;然后按CtrlD键即可将上一行对应位置的内容复制过来——需要注意的是&#xff0c;如果当前行有数据&#xff0c;这些数据会直接被覆…

408学习之c语言(递归与函数)

今天主要学习了递归与函数的相关内容&#xff0c;下面将我今天所学知识与所写代码分享给大家 递归核心要点 递归三要素 基准条件&#xff08;明确终止条件&#xff09; 递归调用&#xff08;逐步分解问题&#xff09; 收敛性&#xff08;确保每次递归都向基准条件靠近&#xff…

swVBA自学笔记016、Solidworks API Help 帮助文档的(三大版块)

目录1. Namespace (命名空间) 版块2. Interface (接口) 版块3. Members (接口成员) 版块4、总结关系5、如果你感觉上面说的过于简单&#xff0c;请往下看!6、示例链接→SOLIDWORKS API Help 20197、需要注意的是&#xff0c;带“I”的对象表示&#xff1a;接口1. Namespace (命…

通俗易懂地讲解JAVA的BIO、NIO、AIO

理解Java的I/O模型&#xff08;BIO、NIO、AIO&#xff09;对于构建高性能网络应用至关重要 &#x1f9e0; 通俗理解&#xff1a;快递站的故事 想象一个快递站&#xff1a; • BIO&#xff1a;就像快递站为每一个包裹都安排一位专员。专员从接到包裹到处理完&#xff08;签收、…

LabVIEW 泵轮检测系统

在汽车行业&#xff0c;泵轮作为液力变矩器关键部件&#xff0c;其质量检测极为重要。传统手工检测泵轮效率低且误差大&#xff0c;为此构建基于 LabVIEW 与西门子硬件结合的泵轮检测系统。 应用场景 聚焦汽车零部件生产车间&#xff0c;对泵轮总成进行出厂前检测。在液力变矩…

2025年8月月赛 T2 T3

一. 七天假日 T2原思路&#xff1a;直接计算左右括号的数量&#xff0c;然后直接输出他们的差改进思路&#xff1a; 用d值记录截止到当前位置&#xff0c;还需要多少个右括号可以满足非法要求cur&#xff1a;截止到当前位置&#xff0c;已经有多少个右括号sum是右括号位置的前缀…

数据结构----栈的顺序存储(顺序栈)

栈的特点&#xff1a;先进后出栈的操作&#xff1a;用数组进行存储&#xff08;1&#xff09;初始化&#xff1a;//栈 typedef struct {int *data;//指针模拟分配数组int top;//栈“顶”指针 }Stack; //初始化 Stack InitStack(){Stack s;//给数组分配空间s.data (int*)malloc…

React Hooks原理深度解析与高级应用模式

React Hooks原理深度解析与高级应用模式 引言 React Hooks自16.8版本引入以来&#xff0c;彻底改变了我们编写React组件的方式。然而&#xff0c;很多开发者仅仅停留在使用层面&#xff0c;对Hooks的实现原理和高级应用模式了解不深。本文将深入探讨Hooks的工作原理、自定义Hoo…

兼职网|基于SpringBoot和Vue的蜗牛兼职网(源码+数据库+文档)

项目介绍 : SpringbootMavenMybatis PlusVue Element UIMysql 开发的前后端分离的蜗牛兼职网&#xff0c;项目分为管理端和用户端和企业端。 项目演示: 基于SpringBoot和Vue的蜗牛兼职网 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可…

TDengine 聚合函数 LEASTSQUARES 用户手册

LEASTSQUARES 函数用户手册 函数定义 LEASTSQUARES(expr, start_val, step_val)功能说明 LEASTSQUARES() 函数对指定列的数据进行最小二乘法线性拟合&#xff0c;返回拟合直线的斜率&#xff08;slope&#xff09;和截距&#xff08;intercept&#xff09;。该函数基于线性回…