Python编程:如何有效等待套接字的读取与关闭

news2024/9/23 3:24:23

亿牛云爬虫代理.png

背景介绍

网络编程是现代应用程序开发的重要组成部分,尤其是在大数据和实时通信的背景下。套接字(Socket)作为网络通信的核心技术,是开发网络应用程序的基础。在Python编程中,如何有效地等待套接字的读取与关闭事件是一个值得深入探讨的话题。无论是构建网络爬虫还是实现聊天应用程序,掌握这一技术都至关重要。

问题陈述

在网络编程中,套接字的读取和关闭事件是不可避免的。套接字读取涉及从网络中接收数据,而关闭事件则是管理连接生命周期的一部分。如果处理不当,可能会导致数据丢失、资源泄漏或应用程序崩溃。为此,我们需要一种高效且可靠的方法来等待和处理这些事件,确保程序的健壮性和稳定性。

解决方案

为了有效地等待套接字的读取与关闭事件,我们可以使用Python的selectors模块和代理IP技术。这不仅可以提升程序的可靠性,还能有效地隐藏真实IP,保护隐私。下面,我们将通过一个具体的示例,展示如何使用代理IP技术和selectors模块实现这一功能。

代码实现

import socket
import selectors
import requests

# 代理IP配置 亿牛云爬虫代理加强版
proxy_host = "www.16yun.cn"  # 代理IP域名
proxy_port = 8080                 # 代理端口
proxy_user = "your_username"      # 代理用户名
proxy_pass = "your_password"      # 代理密码

# 创建代理授权头
proxy_auth = f"{proxy_user}:{proxy_pass}"
proxy_auth_encoded = base64.b64encode(proxy_auth.encode()).decode()

# 选择器对象
sel = selectors.DefaultSelector()

def create_connection(host, port):
    """创建到目标服务器的套接字连接"""
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.connect((proxy_host, proxy_port))

    # 发送CONNECT请求
    connect_request = f"CONNECT {host}:{port} HTTP/1.1\r\nProxy-Authorization: Basic {proxy_auth_encoded}\r\n\r\n"
    sock.sendall(connect_request.encode())

    # 读取代理服务器的响应
    response = sock.recv(4096)
    if b"200 Connection established" not in response:
        raise Exception("无法连接到代理服务器")

    return sock

def handle_events(sock, mask):
    """处理套接字事件"""
    if mask & selectors.EVENT_READ:
        data = sock.recv(1024)
        if data:
            print("收到数据:", data.decode())
        else:
            print("连接已关闭")
            sel.unregister(sock)
            sock.close()
    if mask & selectors.EVENT_WRITE:
        sock.sendall(b"Hello, World!")

# 创建到目标服务器的连接
host = "target.example.com"
port = 80
sock = create_connection(host, port)

# 注册套接字事件
sel.register(sock, selectors.EVENT_READ | selectors.EVENT_WRITE, handle_events)

try:
    while True:
        events = sel.select(timeout=None)
        for key, mask in events:
            callback = key.data
            callback(key.fileobj, mask)
except KeyboardInterrupt:
    print("程序终止")
finally:
    sel.close()

代码解释

  1. 代理IP配置:我们首先定义了代理IP的相关配置,包括域名、端口、用户名和密码,并生成了授权头。
  2. 创建连接:通过create_connection函数,我们实现了与目标服务器的连接。在连接过程中,我们首先连接到代理服务器,并通过CONNECT请求建立隧道。
  3. 事件处理:使用selectors模块,我们注册了套接字的读取和写入事件,并定义了事件处理函数handle_events
  4. 事件循环:在主循环中,我们等待套接字事件的发生,并调用相应的回调函数进行处理。

案例分析

假设我们需要通过网络爬虫从某个网站获取数据,而该网站有反爬措施,通过代理IP可以有效地规避这种限制。在上述代码中,我们展示了如何使用代理IP连接到目标服务器,并通过selectors模块高效地等待和处理套接字的读取与关闭事件。

结论

在Python编程中,等待套接字的读取与关闭事件是网络编程中的关键技术。通过合理使用代理IP技术和selectors模块,我们可以实现高效、可靠的网络通信。本篇文章不仅展示了具体的实现方法,还通过实际案例分析,帮助读者更好地理解和应用这一技术。

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

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

相关文章

无人机之穿越机注意事项篇

一、检查设备 每次飞行前都要仔细检查穿越机的每个部件,确保所有功能正常,特别是电池和电机。 二、遵守法律 了解并遵循你所在地区关于无人机的飞行规定,避免非法飞行。 三、评估环境 在飞行前检查周围环境,确保没有障碍物和…

补码一位乘法原理(布斯编码详讲)

最近在看补码乘法的时候,感觉到很奇怪的一点,那就是补码的一位乘法,就是上网查了大量的资料都没有理解到它真正的原理,总感觉还是不会。那么,补码乘法的原理到底是什么呢?而让我们一直困惑的点是哪里呢&…

Linux运维:MySQL中间件代理服务器,mycat读写分离应用实验

Mycat适用的场景很丰富,以下是几个典型的应用场景: 1.单纯的读写分离,此时配置最为简单,支持读写分离,主从切换 2.分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片 3.多租户应…

【多线程】生产者消费者模型(代码实现)

文章目录 生产者消费者模型介绍生产者消费者模型的特点基于BlockingQueue的生产者消费者模型 生产者消费者模型介绍 生产者消费模型是一种常见的多线程编程模式,广泛应用于解决并发编程中的数据共享和任务调度问题。在该模型中,我们将生产数据并放入缓冲…

“都市绿洲,健康生活新纪元“ —全方位打造高科技多功能智慧健康园

咸宁,这座被誉为"桂花之乡"和"华中康养区"的城市,如同一朵绽放在湖北东南的璀璨明珠。这里桂花飘香,温泉涌动,将自然的馈赠与人文的智慧完美融合。漫步在咸宁,你会被满城金黄的桂花树所吸引&#…

SCSA第四天

ASPF FTP --- 文件传输协议 Tftp --- 简单文件传输协议 FTP协议相较于Tftp协议 ---- 1,需要进行认证 2,拥有一套完整的命令集 用户认证 防火墙管理员认证 ---- 校验登录者身份合法性 用户认证 --- 上网行为管理中的一环 上网用户认证 --- 三层认证…

QImage显示图片像素

在Qt中,QImage 类是用来表示和处理图像的。如果你想查看或显示一个图片的像素数据,你可以使用 QImage 提供的方法来访问这些数据。以下是一些基本的方法来获取和显示图片的像素信息: 获取图像的像素格式: 使用 QImage::format() …

redis相关知识记录

redis基本数据类型 Redis⽀持五种主要数据结构:字符串(Strings)、列表(Lists)、哈希表(Hashes)、集合(Sets)和有序集合(Sorted Sets)。这些数据结…

springboot 旅游导航系统-计算机毕业设计源码69476

目 录 第 1 章 引 言 1.1 选题背景 1.2 研究现状 1.3 论文结构安排 第 2 章 系统的需求分析 2.1 系统可行性分析 2.1.1 技术方面可行性分析 2.1.2 经济方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系统功能需求分析 2.3 系统性需求分析…

Flutter——最详细(Table)网格、表格组件使用教程

背景 用于展示表格组件,可指定线宽、列宽、文字方向等属性 属性作用columnWidths列的宽度defaultVerticalAlignment网格内部组件摆放方向border网格样式修改children表格里面的组件textDirection文本排序方向 import package:flutter/material.dart;class CustomTa…

c#调用c++ dll库报错System.BadImageFormatException

System.BadImageFormatException:“试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)” 1. dll需要选择release模式进行编译 2.选择相同位数,比如x64平台,c#也需要x64 3.不要设置c#不支持的函数供调用 比如: c可以输出到控制台…

Lumos学习王佩丰Excel第四讲:排序与选择

一、排序 1、简单排序:不要选中一列排序,不然只是局部排序,其他数据都会发生错乱。 2、多条件排序 3、2003版本中超过3个排序条件时如何处理:从最后一个条件到第一个条件倒着按照要求依次排序。 4、按颜色排序 5、自定义排序次序…

洛谷P10716【MX-X1-T4】「KDOI-05」简单的字符串问题(扩展kmp+set+二分+扫描线树状数组)

题目 思路来源 小羊肖恩 题解 羊神这个做法tql,当时只是机械地写,过了之后再想想,才觉得确实是nb 先扩展kmp(Z函数)预处理出来数组,记z[i]为i往后可以和前缀匹配的最大长度 对于每个询问(p,cnt)&#x…

Dify工作流中的变量聚合节点

一.定义 变量聚合节点(原变量赋值节点)负责整合不同分支的输出结果,确保无论哪个分支被执行,其结果都能通过一个统一的变量来引用和访问。这在多分支的情况下非常有用,可将不同分支下相同作用的变量映射为一个输出变量…

esp32硬件电路设计

ESP-IDF 入门指南 | 乐鑫科技 (espressif.com) ESP32-DevKitC V4 入门指南 - ESP32 - — ESP-IDF 编程指南 v5.1 文档 (espressif.com)

matlab仿真 模拟调制(上)

(内容源自详解MATLAB/SIMULINK 通信系统建模与仿真 刘学勇编著第五章内容,有兴趣的读者请阅读原书) 1.幅度调制 clear all ts0.0025; %信号抽样时间间隔 t0:ts:10-ts;%时间矢量 fs1/ts;%抽样频率 dffs/length(t); %fft的频率分…

Linux进程间通信:匿名管道 命名管道

Linux进程间通信:匿名管道 &命名管道 一、进程间通信目的二、什么是管道三、匿名管道创建3.1 系统调用原型3.2 匿名管道创建 四、内核创建匿名管道过程五、匿名管道性质5.1 匿名管道的4种特殊情况5.2 匿名管道的5种特性5.3 测试源代码 六、命名管道6.1 创建命名…

高中数学:立体几何-基本立体图形分类

一、常见空间几何体 二、多面体 1、棱柱 2、棱锥 3、棱台 4、相关关系 三、旋转体 1、圆柱 2、圆锥 3、圆台 4、球

LLM 模型压缩之一 | APT

0. 资源链接 论文: APT: Adaptive Pruning and Tuning Pretrained Language Models for Efficient Training and Inference. 项目: https://github.com/ROIM1998/APT 1.背景动机 现有的大模型压缩加速存在以下问题: PEFT: 可以低成本为下游任务微调,…

游戏AI的创造思路-技术基础-蒙特卡洛树搜索(1)

本篇介绍蒙特卡洛树搜索算法,AlphaGo用于围棋计算的应用就是基于蒙特卡洛树搜索研发的~~~ 目录 1. 定义 2. 发展历史 3. 公式和函数 3.1.算法的公式和函数 3.2. Python实现公式和函数 4. 运行原理 4.1. 运行原理 4.2. 各步骤用Python代码 5. 优缺点和缺陷的…