Socketserver 笔记

引入Socketserver的背景:

我们之前使用socket编程的时候,Server端创建一个连接循环(建立连接)+一个通信循环(基于一次连接建立通信循环),(这里的黏包问题我们的实现方式是:我们在发送数据之前我们计算出这个数据的字节流的长度,然后我们把信息封装起来,自定义head头,我们通过struct.pack 的方式),但是这里无法实现并发访问,因为我们的这里的结构是我们创建一个连接之后立马进入通信循环,我们的通信循环不结束的话,我们这里没法建立新的连接(也即是说无法走到连接循环)

创建一个socketserver 至少分以下几步:

  1. First, you must create a request handler class by subclassing the BaseRequestHandlerclass and overriding its handle() method; this method will process incoming requests.   
  2. Second, you must instantiate one of the server classes, passing it the server’s address and the request handler class.
  3. Then call the handle_request() orserve_forever() method of the server object to process one or many requests.
  4. Finally, call server_close() to close the socket.
实现原理:
import socketserver

class MyServer(socketserver.BaseRequestHandler): #这里我们过来一个连接,就创建一个连接实例

    def handle(self):
        '''
        这个是固定的,就要定义一个handle的函数,这里的self代表的就是过来的一个连接实例,这一步操作就相当于之前的tcp_server.accept()操作
        :return:
        '''
        print('conn is: ',self.request)   #conn
        print('addr is: ',self.client_address) #addr

        while True: # 这里就是一个通信循环
            try:
            #收消息
                data=self.request.recv(1024)
                if not data:break
                print('收到客户端的消息是',data,self.client_address)
                #发消息
                self.request.sendall(data.upper())

            except Exception as e:
                print(e)
                break

if __name__ == '__main__':
    s=socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer) #多线程的Tcp服务端(实现并发,开启多个任务来给客户端链接)
    s.serve_forever()
    #socketserver.ThreadingTCPServer  +  serve_forever 实现连接循环,连接循环里面我们套了一个通信循环MyServer
'''
工作原理:
ThreadingTCPServer(多线程处理连接) +  serve_forever(连接循环)  +  MyServer(通信循环)
ThreadingTCPServer  是多线程的
那么当每过来一个客户端请求的时候,都会通过MyServer进行实例化得到一个结果去和客户端通信。当第二个连接过来的额时候,因为我们是多线程的,所以其他的线程就拿着MyServer类进行实例得到一个对象,然后用MyServer里的handle方法进行通信
'''

 实现原理图解:

 笔记整理来自海峰老师的视频:

外加一个Alex的链接 http://www.cnblogs.com/alex3714/articles/5830365.html

原文地址:https://www.cnblogs.com/smail-bao/p/9674902.html