当前位置: 首页 > article >正文

Python网络编程实战:多线程素数服务与简易爬虫开发

目录

一、实验背景与核心价值

二、多线程TCP素数判定服务

2.1 系统架构设计

2.2 服务端实现详解

关键模块导入

核心功能实现

2.3 客户端实现要点

三、基于Socket的网页爬虫开发

3.1 核心实现流程

3.2 安全连接处理

四、关键技术解析

4.1 TCP粘包问题解决方案

4.2 多线程资源管理

4.3 HTTP协议解析要点

五、性能优化建议


一、实验背景与核心价值

本实验通过两个典型场景展示了Python网络编程的核心能力:使用多线程TCP协议实现高并发素数判定服务,以及基于socket的简易网页爬虫开发。这两个案例分别体现了网络编程中的服务端开发与客户端通信技术,以及HTTP协议的实际应用,是理解现代网络编程范式的绝佳切入点。

二、多线程TCP素数判定服务

2.1 系统架构设计

采用经典的主从式(Master-Slave)架构:

  • 服务端:多线程处理客户端连接
  • 客户端:短连接模式
  • 通信协议:TCP协议保证可靠性

2.2 服务端实现详解

关键模块导入
import socket
from itertools import count
from threading import Thread
import struct
from msvcrt import getwche
核心功能实现

素数计算算法优化:​

def getPrimes():
    primes = {2, 3, 5}
    
    def isPrime(n):
        if n <= 1:
            return False
        if n in primes:
            return True
        if n % 6 not in {1, 5}:
            return False
        sqrt_n = int(n**0.5)
        for i in range(3, sqrt_n+1, 2):
            if n % i == 0:
                return False
        primes.add(n)
        return True
    
    for num in count(7, 2):
        try:
            isPrime(num)
        except MemoryError:
            break

网络通信处理流程:​

def receiveNumber():
    sock = socket.socket()
    sock.bind(('localhost', 5005))
    sock.listen(50)
    
    while True:
        client, addr = sock.accept()
        try:
            # 接收数据长度
            length = struct.unpack('i', client.recv(4))[0]
            # 接收实际数据
            data = client.recv(length).decode()
            num = int(data)
            
            max_prime = max(primes)
            if num > max_prime:
                response = "需要计算,结果未知"
            else:
                response = "是素数" if num in primes else "不是素数"
            
            # 构造响应数据
            response_data = response.encode()
            header = struct.pack('i', len(response_data))
            client.sendall(header + response_data)
            
        except Exception as e:
            print(f"处理错误: {e}")
        finally:
            client.close()

2.3 客户端实现要点

健壮的输入验证:​

while True:
    data = input("输入数字(q退出): ").strip()
    if not data:
        continue
    if data == 'q':
        break
    if not data.isdigit():
        print("无效输入")
        continue
    # 网络通信处理...

网络异常处理:​

try:
    sock = socket.socket()
    sock.settimeout(0.5)
    sock.connect(('127.0.0.1', 5005))
    sock.settimeout(None)
except Exception as e:
    print("服务器不存在")
    exit(1)

三、基于Socket的网页爬虫开发

3.1 核心实现流程

HTTP请求构造器:​

def build_request(host, path):
    return f"GET {path} HTTP/1.1\r\n" \
           f"Host: {host}\r\n" \
           "User-Agent: PythonSocketCrawler/1.0\r\n" \
           "Connection: close\r\n\r\n"

响应处理优化:​

def process_response(response):
    try:
        headers, _, body = response.partition('\r\n\r\n')
        title_match = re.search(r'<title>(.*?)</title>', body, re.IGNORECASE)
        return title_match.group(1) if title_match else "无标题"
    except UnicodeDecodeError:
        return "解码错误"

3.2 安全连接处理

context = ssl.create_default_context()
if scheme == 'https':
    secure_sock = context.wrap_socket(sock, server_hostname=host)
    secure_sock.connect((host, port))
    secure_sock.send(request_text.encode())
    response = receive_all(secure_sock)

四、关键技术解析

4.1 TCP粘包问题解决方案

通过固定头部长度的方式解决:

  1. 先发送4字节的包长度信息
  2. 接收方先读取包头获取数据长度
  3. 根据长度读取完整数据包

4.2 多线程资源管理

  • 使用守护线程处理后台任务
  • 主线程控制程序生命周期
  • 全局资源使用线程安全的数据结构

4.3 HTTP协议解析要点

  • 严格处理状态码(如301重定向)
  • 正确处理Transfer-Encoding
  • 处理分块传输编码(chunked encoding)

五、性能优化建议

  1. 连接池技术:客户端使用连接池复用TCP连接
  2. 素数计算优化:采用Miller-Rabin概率素数测试算法
  3. 内存管理:使用Bloom Filter处理大素数集合
  4. 异步IO:考虑asyncio替代多线程方案

http://www.kler.cn/a/611929.html

相关文章:

  • Pytorch :维度转化
  • Vue2+Lodop插件实现在线打印功能(提供Gitee源码)
  • BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab)
  • pcl 1.14.1 vs2022 Eigen::internal::aligned_free bug
  • 基于YOLOv8深度学习的PCB缺陷检测识别系统【python源码+GUI界面+数据集+训练代码+登录界面】
  • 中医气血精津辨证
  • 【后端】【Django DRF】Django ORM 详解:一对一、一对多、多对多
  • Windows下Tomcat的下载与安装
  • 单应性矩阵(homography)
  • SpringMVC 拦截器详解
  • 堆的常见应用1
  • 细胞内与细胞间网络整合分析!神经网络+细胞通讯,这个单细胞分析工具一箭双雕了(scTenifoldXct)
  • 【机器学习】——机器学习基础概念
  • python进行数据分析(以A 股为例)
  • uniapp开发中store的基本用法和模块化详解
  • uniapp上传图片之前压缩处理
  • 解构 HarmonyOS:技术神话背后的理性审视
  • 给聊天机器人装“短期记忆“:Flask版实现指南
  • 高级数据结构02AVL树
  • AI编程工具哪家强?对比Cusor、Copilot、Cline