Python自学day-8
一、SocketServer
简化了编写网络服务器的难度。
1.SocketServer类型
- socketserver.TCPServer :提供一个TCP的socketserver。
- socketserver.UDPServer :提供了一个UDP的socketserver,参数同TCPServer。
- socketserver.UnixStreamServer : 系统内部通讯用的基于TCP的socketserver。
- socketserver.UnixDatagramServer : 系统内部通讯用的基于UDP的socketserver。
2.SocketServer继承结构

3.使用Socketserver实现服务器
socketserver端:
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): #该类必须继承socketserver里的BaseRequestHandler类
def handle(self): while True:
try:
self.data = self.request.recv(1024).strip()
except ConnectionResetError as err:
print(err)
break
else:
print("{} wrote".format(self.client_address[0]))
print(self.data) self.request.send(self.data.upper()) # 将接收到的数据全部大写再发送回client if __name__ == "__main__":
HOST,PORT = "0.0.0.0",9999 server = socketserver.TCPServer((HOST,PORT),MyTCPHandler) #把MyTCPHandler类传进去,每次有client连接,都会创建一个MyTCPHandler的实例来处理
server.serve_forever() #永久运行
使用client来测试连接:
client = socket.socket()
client.connect(("localhost",9999)) while True:
msg = input(">>:").strip()
if len(msg) == 0:continue
client.send(msg.encode("utf-8"))
data = client.recv(1024) print("recv : ",data.decode()) client.close()
注意:当前还无法实现多客户端并行。
二、多线程、多进程支持
1.使用多线程
如果要实现多客户端并行,则需要多线程支持:
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): #该类必须继承socketserver里的BaseRequestHandler类
def handle(self): while True:
try:
self.data = self.request.recv(1024).strip()
except ConnectionResetError as err:
print(err)
break
else:
print("{} wrote".format(self.client_address[0]))
print(self.data) self.request.send(self.data.upper()) # 将接收到的数据全部大写再发送回client if __name__ == "__main__":
HOST,PORT = "0.0.0.0",9999 server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler) #把MyTCPHandler类传进去,每次有client连接,都会创建一个MyTCPHandler的实例来处理
server.serve_forever() #永久运行
上述代码中,我们将TCPServer()替换成ThreadingTCPServer(),则可以支持多线程并发形式的服务器。在这种方式下,每一个client连接时,服务端都会开启一个新的线程来做处理。
ThreadingTCPServer继承了TCPServer类和ThreadingMinIn类,TCPServer类中实现了对单个请求的各种操作,ThreadingMinIn类中实现了对多线程的支持。具体可查看实现源码。
2.使用多进程
server = socketserver.ForkingTCPServer((HOST,PORT),MyTCPHandler)
在Windows上会出错,在Linux上运行正常。
(附)建议
建议对Socketserver.BaseRequestHandler源码进行解读:(可自行研究)
- fileno():文件描述符,一般用不到
- handle_request():处理单个请求,一般也用不到
- server_forever(poll_interval=0.5):永久运行server,直到一个明确的shutdown命令。poll_interval为每0.5秒检查一下有无shutdown命令。
- service_actions():接收到shutdown后清理zombie。
- shutdown():停止server_forever循环。
- 等等
Python自学day-8的更多相关文章
- python自学笔记
python自学笔记 python自学笔记 1.输出 2.输入 3.零碎 4.数据结构 4.1 list 类比于java中的数组 4.2 tuple 元祖 5.条件判断和循环 5.1 条件判断 5.2 ...
- Python - 自学django,上线一套资产管理系统
一.概述 终于把公司的资产管理网站写完,并通过测试,然后上线.期间包括看视频学习.自己写前后端代码,用时两个多月.现将一些体会记录下来,希望能帮到想学django做web开发的人.大牛可以不用看了,小 ...
- 拎壶冲冲冲专业砸各种培训机构饭碗篇----python自学(一)
本人一直从事运维工程师,热爱运维,所以从自学的角度站我还是以python运维为主. 一.python自学,当然少不了从hello world开始,话不多说,直接上手练习 1.这个可以学会 print( ...
- [Python自学] day-21 (2) (Cookie、FBV|CBV装饰器)
一.什么是Cookie 1.什么是Cookie? Cookie是保存在客户端浏览器中的文件,其中记录了服务器让浏览器记录的一些键值对(类似字典). 当Cookie中存在数据时,浏览器在访问网站时会读取 ...
- [Python自学] day-21 (1) (请求信息、html模板继承与导入、自定义模板函数、自定义分页)
一.路由映射的参数 1.映射的一般使用 在app/urls.py中,我们定义URL与视图函数之间的映射: from django.contrib import admin from django.ur ...
- [Python自学] day-20 (Django-ORM、Ajax)
一.外键跨表操作(一对多) 在 [Python自学] day-19 (2) (Django-ORM) 中,我们利用外键实现了一对多的表操作. 可以利用以下方式来获取外键指向表的数据: def orm_ ...
- [Python自学] day-19 (2) (Django-ORM)
一.ORM的分类 ORM一般分为两类: 1.DB first:先在DB中创建数据库.表结构,然后自动生成代码中的类.在后续操作中直接在代码中操作相应的类即可. 2.Code first:直接在代码中实 ...
- [Python自学] day-19 (1) (FBV和CBV、路由系统)
一.获取表单提交的数据 在 [Python自学] day-18 (2) (MTV架构.Django框架)中,我们使用过以下方式来获取表单数据: user = request.POST.get('use ...
- [Python自学] day-18 (2) (MTV架构、Django框架、模板语言)
一.实现一个简单的Web服务器 使用Python标准库提供的独立WSGI服务器来实现MVC架构. 首先,实现一个简单的Web服务器: from wsgiref.simple_server import ...
- Python自学之路---Day13
目录 Python自学之路---Day13 常用的三个方法 匹配单个字符 边界匹配 数量匹配 逻辑与分组 编译正则表达式 其他方法 Python自学之路---Day13 常用的三个方法 1.re.ma ...
随机推荐
- java学习笔记(2)——函数
int a = 1; a = a++; 1,取出a的值1作为a++表达式的值(a++表达式等于1) 2,a增加1变为2 3,执行赋值运算,a++表达式的值再赋给a,a又成为了1. ---------- ...
- 一个Java工程师的入门级Linux命令集
0.前言 网上介绍linux的命令的文章一大堆,但是大部分都是流于命令介绍,把命令的所有参数都介绍一遍,但是其实在真正的工作中,很多参数都不会用到.本文总结了我自己常用的一些命令,这些命令都比较 ...
- 随机森林算法原理及OpenCV应用
随机森林算法是机器学习.计算机视觉等领域内应用较为广泛的一个算法.它不仅可以用来做分类(包括二分类和多分类),也可用来做回归预测,也可以作为一种数据降维的手段. 在随机森林中,将生成很多的决策树,并不 ...
- SQL Server 2017 正式发布:同时支持 Windows 和 Linux(现在看下来,当年那德拉的“云优先,移动优先”是有远见的,而且是有一系列的措施和产品相配合的,只是需要一点时间而已。真是佩服!!)
微软在去年 3 月首次对外宣布了 Linux 版的 SQL Server,并于今年 7 月发布了首个公开 RC 版.前几日在美国奥兰多召开的微软 Ignite 2017 大会上,微软宣布 SQL Se ...
- mybatis 使用经验小结 good
一.多数据源问题 主要思路是把dataSource.sqlSesstionFactory(用来产生sqlSession).MapperScannerConfigurer在配置中区分开,各Mapper对 ...
- WPF获取外部EXE图标最简单的方法
原文:WPF获取外部EXE图标最简单的方法 首先在工程添加对System.Drawing的引用 创建以下方法: public static ImageSource GetIcon(string fil ...
- kbmmw 中XML 操作入门(跨平台,而且可以与JSON,YAML,BSON 直接互相转换)
delphi 很早以前就自带了xml 的操作,最新版里面有三种XML 解释器,一种是MSXML,看名字就知道 这个是微软自带的,这个据delphi 官方称是速度是最快的,但是只能在windows 上使 ...
- WPF-3D动效-文字球形环绕
原文:WPF-3D动效-文字球形环绕 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u013224722/article/details/81784 ...
- Ubuntu安装配置Qt 4.86环境
安装 QT4.8.6库+QT Creator 2.4.1 下载地址公布 QT4.8.6库 http://mirrors.hustunique.com/qt/official_releases/qt/ ...
- WPF 4 Ribbon 开发 之 应用程序菜单(Application Menu)
原文:WPF 4 Ribbon 开发 之 应用程序菜单(Application Menu) 在上一篇中我们完成了快捷工具栏的开发,本篇将讲解应用程序菜单开发的相关内容.如下图所示,点击程序窗 ...