常州网站建设服务中国建设监理协会网站个人会员系统
常州网站建设服务,中国建设监理协会网站个人会员系统,网站制作价格明细,大浪做网站一、基于tcp的socket通信的基本原理分析。基于tcp的socket通信#xff0c;主要依靠两个循环#xff0c;分别是连接循环和通信循环。这个前面的文章有写过#xff0c;在这里就不再重复了。二、socketserver实现多并发的原理分析。1.server类#xff1a;2.reques类。类继承关… 一、基于tcp的socket通信的基本原理分析。基于tcp的socket通信主要依靠两个循环分别是连接循环和通信循环。这个前面的文章有写过在这里就不再重复了。二、socketserver实现多并发的原理分析。1.server类2.reques类。类继承关系示例代码import socketserver
import struct
import json
import os
class FtpServer(socketserver.BaseRequestHandler):codingutf-8server_dirfile_uploadmax_packet_size1024BASE_DIRos.path.dirname(os.path.abspath(__file__))def handle(self):print(self.request)while True:dataself.request.recv(4)data_lenstruct.unpack(i,data)[0]head_jsonself.request.recv(data_len).decode(self.coding)head_dicjson.loads(head_json)# print(head_dic)cmdhead_dic[cmd]if hasattr(self,cmd):funcgetattr(self,cmd)func(head_dic)def put(self,args):file_path os.path.normpath(os.path.join(self.BASE_DIR,self.server_dir,args[filename]))filesize args[filesize]recv_size 0print(-----, file_path)with open(file_path, wb) as f:while recv_size filesize:recv_data self.request.recv(self.max_packet_size)f.write(recv_data)recv_size len(recv_data)print(recvsize:%s filesize:%s % (recv_size, filesize))
ftpserversocketserver.ThreadingTCPServer((127.0.0.1,8080),FtpServer)
ftpserver.serve_forever()分析开始结合上面的例子还有类关系图一块看。ftpserversocketserver.ThreadingTCPServer((127.0.0.1,8080),FtpServer)
ftpserver.serve_forever()查找属性的顺序ThreadingTCPServer-ThreadingMixIn-TCPServer-BaseServer通过ThreadingTCPServer 这个类实例化出一个ftpserver对象。1.2 先从ThreadingTCPServer这个类中找__init__方法SocketServer的源码中可以看到它本身并没有__init__方法这时候就从ThreadingTCPServer所继承的两个父类中去找。从源码中可以看到ThreadingTCPServer一共继承了两个父类分别是ThreadingMixIn和TCPServer其中ThreadingMixIn中也没有__init__方法最终在TCPServer下找到了__init__此时执行TCPServer下的__init__方法。 1.3 TCPServer下的__init__方法一共做了四件事分别是执行了BaseServer类下的__init__方法创 建了socket对象绑定了IP地址和端口bind以及开始listen监听。 BaseServer类下的__init__方法做了两件事为创建出来的对象添加了两个属性分别 是server_address和RequestHandlerClass其中server_address是服务端绑定的ip地址和端 口RequestHandlerClass是前面我们自己创建的FtpServer类。 完成了bind和listen操作是因为执行了server_bind和server_active 2.Serve_forever 实现连接循环。 2.1前面说了ftpserver这个对象是由ThreadingTCPServer这个类创建出来的所以说默认情况下ftpserver这个对象本身以及ThreadingTCPServer这个类都没有Serve_forever这个方法依旧按照上面的套路阅读源码从ThreadingTCPServer继承的父类中去找分别是ThreadingMixIn和TCPServer在这两个父类中都没有找到接着去看ThreadingMixIn和TCPServer继承的父类....关于继承顺序的概念在这也不再赘述.....最终在BaseServer中找到了Serve_forever这个方法。 2.2serve_forever下主要执行self._handle_request_noblock()进而执行request, client_address self.get_request()就是TCPServer中的self.socket.accept()然后执行self.process_request(request, client_address)在ThreadingMixIn中找到process_request开启多线程应对并发进而执行process_request_thread执行self.finish_request(request, client_address)。 2.3上述四部分完成了链接循环本部分开始进入处理通讯部分在BaseServer中找到finish_request,触发我们自己定义的类的实例化去找__init__方法而我们自己定义的类没有该方法则去它的父类也就是BaseRequestHandler中找.... 最后总结下创建socketserver的几个步骤。First, you must create a request handler class by subclassing the BaseRequestHandlerclass and overriding its handle() method; this method will process incoming requests. 首先你必须创建一个类这个类必须是BaseRequestHandler的子类并且这个类必须要有一个handle方法这个方法用来处理连接进来的请求。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() or serve_forever() method of the server object to process one or many requests.然后执行服务器对象的handle_request()或 serve_forever()方法 来处理一个或多个请求。4.Finally, call server_close() to close the socket.最后执行server_close()这个方法关闭套接字。 转载于:https://blog.51cto.com/suhaozhi/1923787
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/90480.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!