python-socket总结

Socket理论知识

socket起源于Unix,而Unix/Linux的哲学就是一切都是文件,对于文件的基本操作就是【打开】【读写】【关闭】模式来操作

socket就是该模式的一个实现,socket就是一个特殊的文件,一些socket函数就是对其进行操作(读写IO,打开,关闭)

file模块是针对具体的文件,打开,读写,关闭
socket模块是针对服务器和客户端socket,打开,读写,关闭

服务器端会首先提供一个socket进行监听,提供一个可读写的socket对外开放,客户端新建socket之后,连接上服务端的socket进行读写操作(send - write,recv - read)

socket的使用具体步骤:

服务端:

创建流套接字描述符

命名套接字描述符(协议,地址,端口)

监听客户端socket请求,并设定最大连接数

接收客户端socket请求,创建新套接字描述符进行读写操作

客户端:

创建套接字描述符

连接server套接字

发送请求,对socket进行数据读写

在网络编程中,套接字作为客户端与服务端交互的接口

在linux系统中,一切即文件,对于普通文件就是直接读取文件,而对于套接字则是一个特殊的文件

也可以打开,关闭,进行IO读写,socket的读写主要是通过一些函数来体现,例如recv,send等等

IO多路复用就是通过一种机制,可以监控多个描述符socket,一旦描述符就绪(读就绪或者写就绪),能够通知程序进行相应的操作

这里的读就绪表示,socket本身是可以阻塞的,当进行读时,要由数据才能读取,当内核准备数据完成之后,同时把数据拷贝由内核拷贝到用户之后,socket才会读就绪,这是程序就可以进行相应的处理。

当设置socket为非阻塞时,进行recv等操作时没有数据就会报错错误信息

这里的写就绪代表

Socket使用

socketserver.py

python内置的socketserver模块,提供了基于IO多路处理select模型的服务

其基本原理是创建一个socket监听端口,然后将socket注册到select进行处理,拿TCP来做一个例子的话,可以将socketserver划分为以下基层关系:

  1. BaseServer类

    此类作为socket服务的基础类,主要接收两个基础参数

    1. server_address,监听的地址及服务

    2. RequestHandlerClass,接收到请求后的,请求处理类

    通过使用类的方式server_forever来启动服务。此步操作会将此【对象】注册到select中,注册事件为read事件。通过select监听是否存在可以处理的请求,存在之后就将调用非阻塞来处理请求

    具体处理的方法,可由子类重写完成

* 注:我对此处理解时有一个问题重点了解的,那就是调用select.register时,是将self传递过去的,后来经过查找select的register方法,注册时,这个self的参数要么是一个int值,要么提供fileno函数,来获取文件描述符 *

重点函数:

finish_request函数,调用初始化时的RequestHandlerClass,同时将请求过来的socket和address传递给RequestHandlerClass来处理,具体处理由其来处理。

handle_error函数,只是将错误信息输出到终端
  1. TCPServer类

    此类继承自BaseServer类,重点实现了TCP连接相关的操作

    1. 初始化时,创建一个socket对象,同时将给定地址绑定到socket上

    2. 重写父类的server_activate函数,就是将socket进行监听,可以接收外部请求

    3. 增加了fileno函数,能够返回socket的文件描述符,在select注册时会使用到文件描述符,实质就是获取socket的描述符

    4. 重写了get_request函数,实质就是socket监听后,能够接收请求,就是使用socket.accept()

    5. 重写shutdown_request,close_request,server_close函数,实质就是换成socket的关闭操作

  2. ThreadingMixIn类

    此类是作为一个混合类出现,作为别的类的父类使用,这是一个旧式类,就是没有继承自object,如果继承object的话,就是使用object的init函数

    而这种的话,只会继承此类中的方法和属性

    这个类主要是重写了BaseServer的process_request函数,并且重新构造了一个process_request_thread方法

    此类的目的是将接收到请求,然后创建一个线程,将请求放入到线程中执行

    而在重新定义的函数process_request_thread函数中,主要是完成两步工作

    1. 调用BaseServer的finish_request(此函数可能会被BaseServer的子类重写)

    2. 完成后调用BaseServer的shutdown_request函数

    3. 如果异常的话,调用BaseServer的handle_error函数

  3. ThreadingTCPServer类

    继承自ThreadingMixIn和TCPServer,因为ThreadingMixIn是一个旧式类没有init方法,实质走的是TCPServer的init方法

  4. BaseRequestHandler类

    处理请求的类,接收传来的参数信息

    1. request 请求对象,实质应该是一个socket

    2. client_address 请求客户端的地址

    3. server 初始监听的Server对象

    此类中实际定义了三个函数

    1. setup函数

    2. handle函数

    3. finish函数

    三个函数的实际执行顺序是,首先执行setup设置一些基础信息(此处只是接口,没有实质处理,在子类中可根据情况来实际执行),然后执行handle,实际处理,最后无论如何再执行finish进行一些额外操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值