博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
socketserver实现并发
阅读量:5010 次
发布时间:2019-06-12

本文共 2734 字,大约阅读时间需要 9 分钟。

  在python编程中,一般可以通过使用socketserver简化操作并实现并发操作。socketserver实际上是对socket的再封装,在基于tcp的编程中主要是两个循环:1.链接循环,2.通讯循环。链接循环负责tcp的四次握手,建立服务器端和客户端的通信通道,通讯循环负责client端和server端之间进行数据交流,因此在socketserver模块中主要分为两大类来分别解决链接循环(server类)和通讯循环(Handler类)的问题,此外MIxIn类为server提供多线程/多进程的并发处理能力

  一.Server类:专门处理链接。BaseServer/TCPServer/UDPServer用来接收客户的请求。TCPServer处理TCP请求,UDPServer处理UDP请求。BaserServer是基类,不能直接使用。TCPServer继承自BaseServer,UDPServer继承自TCPServer。此外还有UnixSreamServer和UnixDatagramServer两个类分别接受Unix系统下的流信息(数据报)

  二.Handler类:专门处理通信。BaseRequestHandler/DatagramRequestHandler/StreamRequestHandler用来处理每一个客户请求。一般用使用BaseRequestHandler就行,但StreamRequestHandler/DatagramRequestHandler(继承子BaseRequestHandler)提供了一些特别的功能,前者用来处理流式(TCP)请求,后者处理数据报(UDP)请求。Server每收到一个客户请求就会创建一个Handler类示例来处理该请求。默认情况下,TCPServer/UDPServer是单进程单线程的模型,依次处理每个客户请求,一个请求处理完毕才能接着处理下一个请求。

  三.是MixIn类:专门处理并发。ForkingMixIn/ThreadingMixIn用来为Server提供多进程/多线程并发处理能力的。ForkingMixIn是多进程模型,ThreadingMixin是多线程模型。这里特别巧妙的是,你只要创建一个类,同时继承Server类和MixIn类就能自动获得并发处理请求的能力。

  代码实例

  

server端#导入该模块import socketserver#定义一个类,继承socketserver.BaseRequestHandlerclass Server(socketserver.BaseRequestHandler):    def handle(self):    #打印客户端地址和端口        print('New connection:',self.client_address)    #循环        while True:        #接收客户发送的数据            data = self.request.recv(1024)            if not data:break#如果接收数据为空就跳出,否则打印            print('Client data:',data.decode())            self.request.send(data)#将收到的信息再发送给客户端if __name__ == '__main__’:    host,port = '127.0.0.1’,8080  #定义服务器地址和端口    server = socketserver.ThreadingTCPServer((host,port),Server) #实现了多线程的socket通话    server.serve_forever()#不会出现在一个客户端结束后,当前服务器端就会关闭或者报错,而是继续运行,与其他的客户端继续进行通话。client端import socketip_port = ('127.0.0.1',8080)sk = socket.socket()sk.connect(ip_port)while True:    raw = input('>> ').strip()    sk.send(bytes(raw,'utf8'))    msg = sk.recv(1024)    print(str(msg,'utf8'))sk.close()

 

 

总结:

   socketserver使用步骤总结

    1、创建一个继承socketserver.BaseRequestHandler的类

    2、类中必须重写一个名为handler的方法

    3、实例化一个服务器类,传入服务器的地址和请求处理程序类

    4、调用serve_forever()事件循环监听

  ThreadingTCPServer执行过程

    1、启动服务端程序

    2、执行TCPServer.__init__方法,创建服务端socket对象并绑定IP和端口(根据类的继承关系,即查找顺序找到TCPServer.__init__())

    3、执行BaseServer.__init__方法,将自定义的继承自socketserver.BaseRequestHandler的类MyRequestHandler赋值给self.RequestHandlerClass class                              TCPServer(BaseServer): #(继承了BaseServeer

    4、通过实例化的对象,执行serve_forever方法,该方法首先查找到BaseServer下的方法,通过调用selector模块,注册事件监听对象,并执行                                                 _handle_request_noblock方法 找到此方法,并调用该方法下的process_request方法,在此调用到finish_request方法,通过finish_request方法,

               执行了RequestHandlerClass 方法,执行此方法就相当于调用 了我们重写的Handler类。  

    5、通过Handler类实例化对象,调用继承的BaseRequestHandler类中的__init__方法,并执行了handler方法。 从而运行了我们重写Handler类中的handler方法。

 

转载于:https://www.cnblogs.com/chenjie2018/p/8538730.html

你可能感兴趣的文章
利用Excel 2010数据透视图实现数字的可视化的图形直观展示
查看>>
Sort Colors
查看>>
HTML文本框水印
查看>>
2048记录反查(ruby)
查看>>
用ssh整合时,用sessionfactory的getCurrentSession()获取不到session
查看>>
【Alpha版本】 第四天 11.10
查看>>
软件公司书籍推荐——按角色划分
查看>>
剑指offer和leetcode都有的_反转链表
查看>>
chrome 插件地址 知乎
查看>>
javascript全局变量都是window对象的属性
查看>>
第八届蓝桥杯省赛第七题---日期问题
查看>>
iview树的修改某个节点,树刷新后自动展开你刚才展开的所有节点
查看>>
oracle服务起不来以及无法监听问题解决
查看>>
Mvc--Html.ActionLink()的用法
查看>>
delphi 基础书籍推荐
查看>>
《面向对象程序设计》2018年春学期寒假及博客作业总结
查看>>
iOS开发UI之KVC(取值/赋值) - KVO (观察某个对象的某个属性的改变)
查看>>
1.7 将一个MxN矩阵所有为0的元素所在行和列全部置0
查看>>
删除U盘时提示无法停止‘通用卷’设备的解决方法!!不要每次都硬拔了,对电脑有不小的损害!!!...
查看>>
Java中接口与接口和类之间的关系
查看>>