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

  • 相关阅读:
    [服务器]Windows Server 2008 64位1核1G安装SQL Server2008
    [工作]离职了!好好休息一下
    [工作]IT连和IT恋产品已完成第一版,准备上线运营
    [SQL Server]储存过程中使用临时表循环操作数据
    [Swift]Xcode格式化代码快捷键
    [Swift]使用Alamofire传递参数时报错
    [工作]记录一下目前的工作
    [Swift]Swift图片显示方式设置,控件UIImageView的contentMode属性设置
    [Swift]创建桥接文件,Swift使用MJRefresh刷新插件
    我遇到了改变的机会
  • 原文地址:https://www.cnblogs.com/smail-bao/p/9674902.html
Copyright © 2011-2022 走看看