zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Screen print or copy
    <转>关于SQL Server数据库的若干注意事项
    sql server 链接到oracle库,读取对应信息
    LinkedServer链接服务器的使用
    序号生成一例
    新解:报表服务器数据库的版本格式无效,或无法读取。已找到的版本为“Unknown”,而所需的版本为“C.0.8.40”。
    GridView to Excel
    sql server临时表是否存在
    <转>SQL Server大表转为分区表实例
    <转> 人生十二个经典领悟
  • 原文地址:https://www.cnblogs.com/smail-bao/p/9674902.html
Copyright © 2011-2022 走看看