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 ...
随机推荐
- HDU 4862 Jump(更多的联合培训学校1)(最小费用最大流)
职务地址:pid=4862">HDU4862 最小费用流做的还是太少. 建图想不出来. . . 直接引用官方题解的话吧... 最小K路径覆盖的模型.用费用流或者KM算法解决,构造二部图 ...
- 微信公众号开发系列-Http请求包基类
HttpHelper请求包基类,支持get请求和POS要求.以促进微通道交互界面的开发,为了准备的人机交互界面,背部. 1.HttpHelper帮助基类 [csharp] view plaincopy ...
- 非参贝叶斯(Bayesian Non-parameter)初步
0. motivations 如何确定 GMM 模型的 k,既观察到的样本由多少个高斯分布生成.由此在数据属于高维空间中时,根本就无法 visualize,更加难以建立直观,从而很难确定 k,高斯分布 ...
- js div的显示和隐藏
<head> <title></title> <style type="text/css"> div ...
- liunx 系统 一键安装
本文转自:http://hi.baidu.com/iamcyh/item/e777eb81ba90ed5a26ebd9b0 linux VPS环境(MySQL/Apache/PHP/Nginx)一键安 ...
- 查看 Linux 发行版本的名称以及版本号
查看LINUX发行版的名称及其版本号的命令: lsb_release -a cat /etc/redhat-release(针对redhat,Fedora)
- 命令行程序如何获取HINSTANCE?
main() { HINSTANCE hinst = GetModuleHandle(NULL); }
- LoadLibrary方法加载运行DLL库
最近和另一家公司对接,要求用对方提供的测试程序测试我们做的DLL. 接到对方的测试程序,发现和我们以前调用DLL的方式不太一样.但我稍微看了一会代码也看懂其意思了,一天搞定了. 但其中也遇到些小困惑, ...
- duilib菜单开发遇见“0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突”
我的程序是这样一个逻辑. 首先创建用户列表,点击列表项弹出菜单,点击菜单上“设备选项”,弹出设备列表,上面显示这个用户拥有的设备. 菜单的创建参考了这为博主的教程:http://www.cnblogs ...
- PHP MYSQL 获取记录总数
$qid = mysql_query(“SELECT count(aid) as total FROM table group by aid “);//你的查询 $res = mysql_fetch_ ...