python基础之socket与socketserver
admin
2023-03-24 16:41:35
0

    

---引入

Socket的英文原义是“孔”或“插座”,在Unix的进程通信机制中又称为‘套接字’。套接字实际上并不复杂,它是由一个ip地址以及一个端口号组成。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座(ip地址)的房间,每个插座有很多插口(端口),通过这些插口接入电线(进程)我们可以烧水,看电视,玩电脑……  

应用程序通常通过"套接字"向网络发出请求或者应答网络请求

套接字的作用之一就是用来区分不同应用进程,当某个进程绑定了本机ip的某个端口,那么所有传送至这个ip地址上的这个端口的所有数据都会被内核送至该进程进行处理。

---python中的socket

Python 提供了两个基本的 socket 模块。

   第一个是 Socket,它提供了标准的 BSD Sockets API。

   第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。

----socket

   先来说第一个。

我们知道,现在的应用程序大多为C/S架构,也就是分为客户端/服务器端。

  服务器端:服务器端进程需要申请套接字,然后自己绑定在这个套接字上,并对这个套接字进行监听。当有客户端发送数据了,则接受数据进行处理,处理完成后对客户端进行响应。

  客户端:客户端则相对简单些,客户端只需要申请一个套接字,然后通过这个套接字连接服务器端的套接字,连接建立后就可以进行后续操作了。

python编写服务器端的步骤:

  1  创建套接字

python基础之socket与socketserver

=

python基础之socket与socketserver

  2  绑定套接字

s1.bind( address ) 
#由AF_INET所创建的套接字,address地址必须是一个双元素元组,格式是(host,port)。host代表主机,port代表端口号。
#如果端口号正在使用、主机名不正确或端口已被保留,bind方法将引发socket.error异常。
#例: ('192.168.1.1',9999)

  3  监听套接字

s1.listen( backlog ) 
#backlog指定最多允许多少个客户连接到服务器。它的值至少为1。收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。

  4  等待接受连接

python基础之socket与socketserver

connection, address = s1.accept()#调用accept方法时,socket会时入“waiting”状态,也就是处于阻塞状态。客户请求连接时,方法建立连接并返回服务器。#accept方法返回一个含有两个元素的元组(connection,address)。
#第一个元素connection是所连接的客户端的socket对象(实际上是该对象的内存地址),服务器必须通过它与客户端通信;
#第二个元素 address是客户的Internet地址。

python基础之socket与socketserver

  5  处理阶段

python基础之socket与socketserver

connection.recv(bufsize[,flag])
#注意此处为connection
#接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略connection.send(string[,flag])#将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送。

python基础之socket与socketserver

  6  传输结束,关闭连接

s1.close()#关闭套接字

python编写客户端

  1  创建socket对象

import socket
s2=socket.socket()

  2  连接至服务器端

s2.connect(address)#连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。

  3  处理阶段

python基础之socket与socketserver

s2.recv(bufsize[,flag])#接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略s2.send(string[,flag])#将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送。

python基础之socket与socketserver

  4  连接结束,关闭套接字

s2.close()

socket中还有许多方法 :

 

python基础之socket与socketserver

socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0) 10061=0, count=

python基础之socket与socketserver

 

 

好了,介绍完socket现在该介绍socketserver了。

----socketserver

  虽说用Python编写简单的网络程序很方便,但复杂一点的网络程序还是用现成的框架比较 好。这样就可以专心事务逻辑,而不是套接字的各种细节。SocketServer模块简化了编写网络服务程序的任务。同时SocketServer模块也 是Python标准库中很多服务器框架的基础。

socketserver在python2中为SocketServer,在python3种取消了首字母大写,改名为socketserver。

socketserver中包含了两种类,一种为服务类(server class),一种为请求处理类(request handle class)。前者提供了许多方法:像绑定,监听,运行…… (也就是建立连接的过程) 后者则专注于如何处理用户所发送的数据(也就是事务逻辑)。

  一般情况下,所有的服务,都是先建立连接,也就是建立一个服务类的实例,然后开始处理用户请求,也就是建立一个请求处理类的实例

 

我们分析一下源码,来看一看服务类是如何与请求处理类建立联系的。

python基础之socket与socketserver

 == = =

     ===

python基础之socket与socketserver

 

我们接下来介绍一下这两个类

先来看服务类:

5种类型:BaseServer,TCPServer,UnixStreamServer,UDPServer,UnixDatagramServer。

BaseServer不直接对外服务。

TCPServer针对TCP套接字流

UDPServer针对UDP数据报套接字

UnixStreamServer和UnixDatagramServer针对UNIX域套接字,不常用。

他们之间的继承关系:

python基础之socket与socketserver

 

 

服务类的方法:

python基础之socket与socketserver View Code

这个几个服务类都是同步处理请求的:一个请求没处理完不能处理下一个请求。要想支持异步模型,可以利用多继承让server类继承ForkingMixIn 或 ThreadingMixIn mix-in classes。

ForkingMixIn利用多进程(分叉)实现异步。

ThreadingMixIn利用多线程实现异步。

 

请求处理器类:

要实现一项服务,还必须派生一个handler class请求处理类,并重写父类的handle()方法。handle方法就是用来专门是处理请求的。该模块是通过服务类和请求处理类组合来处理请求的。

SocketServer模块提供的请求处理类有BaseRequestHandler,以及它的派生类StreamRequestHandler和DatagramRequestHandler。从名字看出可以一个处理流式套接字,一个处理数据报套接字。

 

请求处理类有三种方法:

  • setup()

  • Called before the handle() method to perform any initialization actions required. The default implementation does nothing.

    也就是在handle()之前被调用,主要的作用就是执行处理请求之前的初始化相关的各种工作。默认不会做任何事。(如果想要让其做一些事的话,就要程序员在自己的请求处理器中覆盖这个方法(因为一般自定义的请求处理器都要继承python中提供的BaseRequestHandler,ps:下文会提到的),然后往里面添加东西即可)

  • handle()

  • This function must do all the work required to service a request. The default implementation does nothing. Several instance attributes are available to it; the request is available as self.request; the client address as self.client_address; and the server instance as self.server, in case it needs access to per-server information.

    The type of self.request is different for datagram or stream services. For stream services,self.request is a socket object; for datagram services, self.request is a pair of string and socket.

    handle()的工作就是做那些所有与处理请求相关的工作。默认也不会做任何事。他有数个实例参数:self.request    self.client_address   self.server

  • finish()

  • Called after the handle() method to perform any clean-up actions required. The default implementation does nothing. If setup() raises an exception, this function will not be called.

    在handle()方法之后会被调用,他的作用就是执行当处理完请求后的清理工作,默认不会做任何事

python基础之socket与socketserver Handler源码

从源码中可以看出,BaseRequestHandler中的setup()/handle()/finish()什么内容都没有定义,而他的两个派生类StreamRequestHandler和DatagramRequestHandler则都重写了setup()/finish()。

因此当我们需要自己编写socketserver程序时,只需要合理选择StreamRequestHandler和DatagramRequestHandler之中的一个作为父类,然后自定义一个请求处理类,并在其中重写handle()方法即可。

 

用socketserver创建一个服务的步骤:

1  创建一个request handler class(请求处理类),合理选择StreamRequestHandler和DatagramRequestHandler之中的一个作为父类(当然,使用BaseRequestHandler作为父类也可),并重写它的handle()方法。

2  实例化一个server class对象,并将服务的地址和之前创建的request handler class传递给它。

3  调用server class对象的handle_request() 或 serve_forever()方法来开始处理请求。


相关内容

热门资讯

今日重大通报“微信链接牛牛辅助... 今日重大通报“微信链接牛牛辅助器?”(原来真的有挂)您好,微信链接牛牛这个游戏其实有挂的,确实是有挂...
终于了解“飞鹰牛牛怎么装挂?”... 您好:飞鹰牛牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4282891】很多玩家在这款游戏...
昇思MindSpore开源五年... 12月25日,昇思人工智能框架峰会在杭州召开,本次大会的主题是“昇思MindSpore为超节点而生的...
谷歌将推出新功能:允许用户更改... 12月25日消息,谷歌公司表示目前正推出一款全新功能,将允许用户直接修改电子邮箱地址前缀(包括以“@...
正式迈入“三跑道”时代!西安咸... 12月25日早上8:00,南方航空CZ8822航班从西安咸阳国际机场新建南二跑道起飞,标志着机场正式...
【第一资讯】“飞鹰炸/金/花到... 您好:飞鹰炸/金/花这款游戏可以开挂,确实是有挂的,需要了解加客服微信【4282891】很多玩家在这...
今日重大发现“白金岛三打哈开挂... 网上科普关于“白金岛三打哈有没有挂”话题很是火热,小编也是针对白金岛三打哈作*弊开挂的方法以及开挂对...
玩家攻略科普“十三十三水经典比... 有 亲,根据资深记者爆料十三十三水经典比鸡是可以开挂的,确实有挂(咨询软...
【第一资讯】“白金岛十胡卡有挂... 有 亲,根据资深记者爆料白金岛十胡卡是可以开挂的,确实有挂(咨询软件无需...
我来教教您“微乐锄大地可以开挂... 我来教教您“微乐锄大地可以开挂吗?”(透视曝光猫腻)您好,微乐锄大地这个游戏其实有挂的,确实是有挂的...