设为首页 收藏本站
查看: 2303|回复: 0

[经验分享] python基础之socket与socketserver-12869490

[复制链接]

尚未签到

发表于 2018-8-14 12:53:45 | 显示全部楼层 |阅读模式
  ---引入
  Socket的英文原义是“孔”或“插座”,在Unix的进程通信机制中又称为‘套接字’。套接字实际上并不复杂,它是由一个ip地址以及一个端口号组成。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座(ip地址)的房间,每个插座有很多插口(端口),通过这些插口接入电线(进程)我们可以烧水,看电视,玩电脑……
  应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
  套接字的作用之一就是用来区分不同应用进程,当某个进程绑定了本机ip的某个端口,那么所有传送至这个ip地址上的这个端口的所有数据都会被内核送至该进程进行处理。
  ---python中的socket
  Python 提供了两个基本的 socket 模块。
  第一个是 Socket,它提供了标准的 BSD Sockets API。
  第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。
  ----socket
  先来说第一个。
  我们知道,现在的应用程序大多为C/S架构,也就是分为客户端/服务器端。
  服务器端:服务器端进程需要申请套接字,然后自己绑定在这个套接字上,并对这个套接字进行监听。当有客户端发送数据了,则接受数据进行处理,处理完成后对客户端进行响应。
  客户端:客户端则相对简单些,客户端只需要申请一个套接字,然后通过这个套接字连接服务器端的套接字,连接建立后就可以进行后续操作了。
  python编写服务器端的步骤:
  1  创建套接字
DSC0000.gif

=

  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  等待接受连接

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

  5  处理阶段

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

  6  传输结束,关闭连接
s1.close()#关闭套接字  python编写客户端
  1  创建socket对象
import socket  
s2=socket.socket()
  2  连接至服务器端
s2.connect(address)#连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。  3  处理阶段

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

  4  连接结束,关闭套接字
s2.close()  socket中还有许多方法 :

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

  好了,介绍完socket现在该介绍socketserver了。
  ----socketserver
  虽说用Python编写简单的网络程序很方便,但复杂一点的网络程序还是用现成的框架比较 好。这样就可以专心事务逻辑,而不是套接字的各种细节。SocketServer模块简化了编写网络服务程序的任务。同时SocketServer模块也 是Python标准库中很多服务器框架的基础。
  socketserver在python2中为SocketServer,在python3种取消了首字母大写,改名为socketserver。

  socketserver中包含了两种类,一种为服务类(server>  一般情况下,所有的服务,都是先建立连接,也就是建立一个服务类的实例,然后开始处理用户请求,也就是建立一个请求处理类的实例。
  我们分析一下源码,来看一看服务类是如何与请求处理类建立联系的。

== = =  

  
     ===

  我们接下来介绍一下这两个类
  先来看服务类:
  5种类型:BaseServer,TCPServer,UnixStreamServer,UDPServer,UnixDatagramServer。
  BaseServer不直接对外服务。
  TCPServer针对TCP套接字流
  UDPServer针对UDP数据报套接字
  UnixStreamServer和UnixDatagramServer针对UNIX域套接字,不常用。
  他们之间的继承关系:
DSC0001.png

  服务类的方法:
DSC0002.gif View Code


  这个几个服务类都是同步处理请求的:一个请求没处理完不能处理下一个请求。要想支持异步模型,可以利用多继承让server类继承ForkingMixIn 或 ThreadingMixIn mix-in>  ForkingMixIn利用多进程(分叉)实现异步。
  ThreadingMixIn利用多线程实现异步。
  请求处理器类:

  要实现一项服务,还必须派生一个handler>  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()方法之后会被调用,他的作用就是执行当处理完请求后的清理工作,默认不会做任何事
Handler源码

  从源码中可以看出,BaseRequestHandler中的setup()/handle()/finish()什么内容都没有定义,而他的两个派生类StreamRequestHandler和DatagramRequestHandler则都重写了setup()/finish()。
  因此当我们需要自己编写socketserver程序时,只需要合理选择StreamRequestHandler和DatagramRequestHandler之中的一个作为父类,然后自定义一个请求处理类,并在其中重写handle()方法即可。
  用socketserver创建一个服务的步骤:

  1  创建一个request handler>
  2  实例化一个server>
  3  调用server>

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-551662-1-1.html 上篇帖子: Python学习:字符串(string) 下篇帖子: python 数据类型学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表