位置: 编程技术 - 正文

Python的socket模块源码中的一些实现要点分析(python socket模块)

编辑:rootadmin

推荐整理分享Python的socket模块源码中的一些实现要点分析(python socket模块),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python socketio,python的socket模块怎么绑定公网ip,python socket模块,python sockets,python的socket模块介绍,python socket模块,python socketserver模块详解,python的socket模块介绍,内容如对您有帮助,希望把文章链接给更多的朋友!

BaseServer 和 BaseRequestHandlerPython为网络编程提高了更高级的封装。SocketServer.py 提供了不少网络服务的类。它们的设计很优雅。Python把网络服务抽象成两个主要的类,一个是Server类,用于处理连接相关的网络操作,另外一个则是RequestHandler类,用于处理数据相关的操作。并且提供两个MixIn 类,用于扩展 Server,实现多进程或多线程。在构建网络服务的时候,Server 和 RequestHandler 并不是分开的,RequestHandler的实例对象在Server 内配合 Server工作。

改模块的主要几个Server关系如下:

BaseServer 分析BaseServer 通过__init__初始化,对外提供serve_forever和 handler_request方法。

init 初始化:

__init__源码很简单。主要作用是创建server对象,并初始化server地址和处理请求的class。熟悉socket编程应该很清楚,server_address是一个包含主机和端口的元组。

serve_forever创建了server对象之后,就需要使用server对象开启一个无限循环,下面来分析serve_forever的源码。

serve_forever接受一个参数poll_interval,用于表示select轮询的时间。然后进入一个无限循环,调用select方式进行网络IO的监听。

如果select函数返回,表示有IO连接或数据,那么将会调用_handle_request_noblock方法。

_handle_request_noblock方法即开始处理一个请求,并且是非阻塞。该方法通过get_request方法获取连接,具体的实现在其子类。一旦得到了连接,调用verify_request方法验证请求。验证通过,即调用process_request处理请求。如果中途出现错误,则调用handle_error处理错误,以及shutdown_request结束连接。

该方法对request进行验证,通常会被子类重写。简单的返回True即可,然后进入process_request方法处理请求。

process_request方法是mixin的入口,MixIn子类通过重写该方法,进行多线程或多进程的配置。调用finish_request完成请求的处理,同时调用shutdown_request结束请求。

finish_request方法将会处理完毕请求。创建requestHandler对象,并通过requestHandler做具体的处理。

BaseRequestHandler 分析所有requestHandler都继承BaseRequestHandler基类。

该类会处理每一个请求。初始化对象的时候,设置请求request对象。然后调用setup方法,子类会重写该方法,用于处理socket连接。接下来的将是handler和finish方法。所有对请求的处理,都可以重写handler方法。

至此,整个Python提供的Server方式即介绍完毕。总结一下,构建一个网络服务,需要一个BaseServer用于处理网络IO,同时在内部创建requestHandler对象,对所有具体的请求做处理。

BaseServer - BaseRequestHandler

BaseServer 和 BaseRequestHandler是网络处理的两个基类。实际应用中,网络操作更多是使用 TCP 或 HTTP 协议。SocketServer.py 也提供了更高级的TCP、UDP封装。下面就来看下关于TCP方面的网络模块(UDP和TCP的在代码组织上差别不是特别大,暂且忽略)。

Python的socket模块源码中的一些实现要点分析(python socket模块)

TCPServerTCPServer 继承了BaseServer,初始化的时候,进行了socket套接字的创建。

__init__ 方法通过 socket模块创建了socket对象,然后进行调用server_bind和server_activate。

server_bind 方法进行socket对象的bind操作,以及设置socket相关属性,如网络地址的复用。

server_activate 方法也比较简单,添加socket对象的listen。

get_request该类最重要的方法就是 get_request。该方法进行返回socket对象的请求连接。

get_request方法是在BaseServer基类中的_handle_request_noblock中调用,从那里里传入套接字对象获取的连接信息。如果是UDPServer,这里获取的就是UDP连接。

此外,TCPServer还提供了一个 fileno 方法,提供给基类的select调用返回文件描述符。

StreamRequestHandlerTCPServer实现了使用tcp套接字的网络服务,Handler方面则是对应的StreamRequestHandler。它继承了BaseRequestHandler。基类的setup方法和finish方法被它重写,用于通过连接实现缓存文件的读写操作。

setup方法:

setup判断了是否使用nagle算法。然后设置对应的连接属性。最重要的就是创建了一个可读(rfile)和一个可写(wfile)的“文件”对象,他们实际上并不是创建了文件,而是封装了读取数据和发送数据的操作,抽象成为对文件的操作。可以理解为 self.rfile 就是读取客户端数据的对象,它有一些方法可以读取数据。self.wfile则是用来发送数据给客户端的对象。后面的操作,客户端数据到来会被写入缓冲区可读,需要向客户端发送数据的时候,只需要向可写的文件中write数据即可。

实现TCP服务需要使用TCPServer和StreamRequestHandler共同协作。大致函数调用流程如下,函数调用用括号表示,赋值不带括号,没有类前缀的表示系统调用:

TCPServer - StreamRequestHandler

最早关于介绍BaseServer的时候,我们知道python对BaseServer设计的时候,预留了可用于Mixin扩展多线程或多进程的接口。mixin通过复写父类的parse_request方法实现。

ThreadingMixInThreadingMixIn 类实现了多线程的方式,它只有两个方法,分别是process_request和 process_request_thread方法。多进程的方式是ForkingMixIn,暂且略过。

process_request方法复写了父类的此方法。以此为接口入口,对每一个请求,调用Thread开启一个新的线程。每一个线程都绑定process_request_thread方法。

process_request_thread方法和BaseServer里的parse_request几乎一样。只不过是多线程的方式调用。

使用的时候,通过多继承调用接口,例如:

具体的调用过程如下:

在Python程序和Flask框架中使用SQLAlchemy的教程 ORM江湖曾几何时,程序员因为惧怕SQL而在开发的时候小心翼翼的写着sql,心中总是少不了恐慌,万一不小心sql语句出错,搞坏了数据库怎么办?又或者

Python第三方库的安装方法总结 Python是一门优雅的语言,简洁的语法,强大的功能。当然丰富的第三方库,更能加速开发。那么问题来了,如何安装这些第三方库(包)呢?安装第三

Python的Flask框架应用调用Redis队列数据的方法 任务异步化打开浏览器,输入地址,按下回车,打开了页面。于是一个HTTP请求(request)就由客户端发送到服务器,服务器处理请求,返回响应(response

标签: python socket模块

本文链接地址:https://www.jiuchutong.com/biancheng/387579.html 转载请保留说明!

上一篇:深入浅析python定时杀进程(python定制函数)

下一篇:在Python程序和Flask框架中使用SQLAlchemy的教程(用python编写的程序称为)

  • 应交增值税已交税金是什么意思
  • 企业工商年报填写须知
  • 企业所得税季度申报
  • 外地预缴的增值税要在本地计算附加税吗?
  • 按利润总额的25%计算应交所得税
  • 捐赠支出和赞助支出的区别
  • 主营业务收入冲销
  • 财务报表层次重大错报风险增大了认定层次
  • 税务未抄报
  • 一般纳税人销售自己使用过的物品
  • 简易计税视同销售如何处理?
  • 企业购入交易性金融资产支付的交易费用
  • 社保已申报但未缴费有什么影响
  • 上个月印花税少计提了怎么办
  • 个人挂靠公司按揭购车账务怎么处理?
  • 其他业务收入借贷方向会计分录
  • 金蝶存货核算的基本流程
  • 升级打装备的手游
  • 资产负债表里的存货怎么算
  • quicktimeplayer.exe - quicktimeplayer是什么进程 有什么用
  • ipad os 16
  • 如何安装纯净win10
  • mstore.exe - mstore是什么进程 有什么用
  • 社保退回的工伤怎么赔偿
  • 赠送积分有两种形式
  • 付不出去的应付账款要交增值税吗
  • 前端框架view
  • 免征的增值税账务处理
  • 外商投资企业法人独资属于内资还是外资
  • php linux常用命令
  • 控制层框架
  • 用python处理图像
  • h5项目怎么打包成app
  • 资产减值损失一经计提不得转回
  • 国际货运代理公司有哪些?
  • 政府会计代扣公积金怎么做分录
  • 缴纳税款滞纳金会计处理
  • 做账计提是什么意思
  • 收到政府补贴的账务处理
  • mongodb 全文索引
  • 成本核算需要哪些数据
  • 同控下的企业合并分录
  • 金税盘怎么向分盘分配发票
  • 制作费开票属于什么编码类型
  • 增值税进项发票是什么意思
  • 一般纳税人的建筑企业可以选择简易征收的条件
  • 小规模纳税人收入会计分录
  • 无形资产的累计折旧
  • 当月进项税额大但是也要交增值税吗
  • 设备安装成本怎么结转
  • 投资性房地产转换计入其他综合收益
  • 客户罚款员工承担
  • 收到税务局退增值税怎么入账
  • 记账凭证是不是转账凭证
  • 退回以前年度所得税账务处理
  • 年报审计调整
  • 从业人数和资产总额指标,应按企业
  • 暂估的进项税额怎么抵扣
  • mysql 连接语句
  • win2000停止服务
  • 怎么彻底关闭windows更新
  • mac使用磁盘工具的快捷键
  • hp是什么软件缩写
  • 禅道界面
  • win7系统电脑打开的软件闪退怎么办
  • win7 64纯净版网页打开出现乱码该怎么办 解决方法介绍
  • linux调整桌面分辨率
  • [置顶] [寒江孤叶丶的Cocos2d-x之旅_29]在Cocos2d-x中集成protobuf (Protocol Buffers)
  • 12个超实用的JQuery代码片段
  • Unity3D游戏开发标准教程吴亚峰于复兴人民邮电出版社
  • 批处理常用命令总结
  • jquery双击
  • unity 动态壁纸
  • js定义类的三种方法
  • 国家扶贫项目有循环卡吗
  • 国家税务局发票真伪查验平台
  • 12366纳税服务热线工作时间
  • 烟酒税收占比
  • 广东省电子税务局app
  • 云南 过年
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设