一、基于tcp的socket通信的基本原理分析。

基于tcp的socket通信,主要依靠两个循环,分别是连接循环和通信循环。

这个前面的文章有写过,在这里就不再重复了。

二、socketserver实现多并发的原理分析。

1.server类:

2.reques类。

类继承关系:

示例代码:

import socketserver
import struct
import json
import os
class FtpServer(socketserver.BaseRequestHandler):coding='utf-8'server_dir='file_upload'max_packet_size=1024BASE_DIR=os.path.dirname(os.path.abspath(__file__))def handle(self):print(self.request)while True:data=self.request.recv(4)data_len=struct.unpack('i',data)[0]head_json=self.request.recv(data_len).decode(self.coding)head_dic=json.loads(head_json)# print(head_dic)cmd=head_dic['cmd']if hasattr(self,cmd):func=getattr(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))
ftpserver=socketserver.ThreadingTCPServer(('127.0.0.1',8080),FtpServer)
ftpserver.serve_forever()

分析开始:

结合上面的例子,还有类关系图一块看。

ftpserver=socketserver.ThreadingTCPServer(('127.0.0.1',8080),FtpServer)
ftpserver.serve_forever()

查找属性的顺序:ThreadingTCPServer->ThreadingMixIn->TCPServer->BaseServer

  1. 通过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的几个步骤。

  1. 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

10.python网络编程(socket server 实现并发 part 2)相关推荐

  1. java网络编程socket\server\TCP笔记(转)

    java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅 1 TCP的开销 a  连接 ...

  2. Python网络编程(Socket)

    Python网络编程(Socket) Python提供了两个访问级别的网络服务.在一个较低的水平,您可以访问底层操作系统的基本套接字支持,允许你实现面向连接和无连接协议的客户端和服务器 Python有 ...

  3. 树莓派 Python 网络编程 (Socket入门)

    树莓派  Python 网络编程 (Socket入门) 什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络 ...

  4. Python网络编程socket

    网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...

  5. python网络编程--socket简单实现

    python网络编程                                                                                           ...

  6. python网络编程-socket编程

    一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层模 ...

  7. 学习笔记(10):Python网络编程并发编程-粘包现象

    立即学习:https://edu.csdn.net/course/play/24458/296240?utm_source=blogtoedu 粘包现象:服务器接收到客户端的命令后,进行执行得到结果后 ...

  8. Day8 - Python网络编程 Socket编程 --转自金角大王

    本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实 ...

  9. python 网络编程--socket模块/struct模块

    socket模块: 客户端:CS架构,  client -> server 浏览器:BS架构,  browser -> server 网络通信本质:传输字节 doc命令查看ip地址:ipc ...

最新文章

  1. [20160513]Restrict Session与静态监听.txt
  2. HTML+CSS+JavaScript复习笔记持更(三)——表单篇
  3. centos6.5 scala环境变量
  4. Django模型(三)
  5. idea 安装php插件_免费版的 IDEA 为啥不能使用 Tomcat ?
  6. Zabbix触发器_action动作及模板应用(二)
  7. 超分辨率在移动实时音视频的应用实践
  8. OpenCV编程-无法解析的外部符号 void __cdecl cv::cvtColor
  9. vue2强制刷新,解决页面不会重新渲染的问题
  10. 雷林鹏分享:jQuery Mobile 方向改变事件
  11. 【手写数字识别】基于matlab CNN网络手写数字识别分类【含Matlab源码 1286期】
  12. 台湾普瑞Parade PS8625| PS8625芯片方案|EDP转LVDS方案| 替代与兼容PS8625
  13. K均值聚类算法以及模糊K均值算法研究,matlab
  14. 2023苏州大学计算机考研信息汇总
  15. 决策树算法(ID3算法)
  16. PS 图层的基本操作
  17. Langlands纲领介绍
  18. [附源码]计算机毕业设计Python+uniapp智能公交查询APP59sm2(程序+lw+APP+远程部署)
  19. 展开阅读全文代码html,展开阅读全文 js 爬虫操作
  20. Altium desiger10安装破解过程

热门文章

  1. this 和super关键字
  2. [BZOJ2725/Violet 6]故乡的梦
  3. react项目在ie空白解决
  4. TensorFlow 官方文档中文版
  5. FZU - 2268 Cutting Game
  6. 三、spring boot 1.5.4 web容器定制(端口号等修改)
  7. Oracle 跨库 查询 复制表数据 分布式查询
  8. 《C和指针》读书笔记
  9. 用Sql添加删除字段,判断字段是否存在的方法
  10. 全国计算机等级考试题库二级C操作题100套(第01套)