socketserver实现并发

Posted chenjie2018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socketserver实现并发相关的知识,希望对你有一定的参考价值。

  在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.BaseRequestHandler
class 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 socket
ip_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实现并发的主要内容,如果未能解决你的问题,请参考以下文章

socketserver模块(实现并发)

socketserver实现并发

socketserver实现并发

python,利用socketserver模块实现并发聊天

基于socketserver实现并发

Python之路 - Socketserver实现多并发