一、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的更多相关文章

  1. python自学笔记

    python自学笔记 python自学笔记 1.输出 2.输入 3.零碎 4.数据结构 4.1 list 类比于java中的数组 4.2 tuple 元祖 5.条件判断和循环 5.1 条件判断 5.2 ...

  2. Python - 自学django,上线一套资产管理系统

    一.概述 终于把公司的资产管理网站写完,并通过测试,然后上线.期间包括看视频学习.自己写前后端代码,用时两个多月.现将一些体会记录下来,希望能帮到想学django做web开发的人.大牛可以不用看了,小 ...

  3. 拎壶冲冲冲专业砸各种培训机构饭碗篇----python自学(一)

    本人一直从事运维工程师,热爱运维,所以从自学的角度站我还是以python运维为主. 一.python自学,当然少不了从hello world开始,话不多说,直接上手练习 1.这个可以学会 print( ...

  4. [Python自学] day-21 (2) (Cookie、FBV|CBV装饰器)

    一.什么是Cookie 1.什么是Cookie? Cookie是保存在客户端浏览器中的文件,其中记录了服务器让浏览器记录的一些键值对(类似字典). 当Cookie中存在数据时,浏览器在访问网站时会读取 ...

  5. [Python自学] day-21 (1) (请求信息、html模板继承与导入、自定义模板函数、自定义分页)

    一.路由映射的参数 1.映射的一般使用 在app/urls.py中,我们定义URL与视图函数之间的映射: from django.contrib import admin from django.ur ...

  6. [Python自学] day-20 (Django-ORM、Ajax)

    一.外键跨表操作(一对多) 在 [Python自学] day-19 (2) (Django-ORM) 中,我们利用外键实现了一对多的表操作. 可以利用以下方式来获取外键指向表的数据: def orm_ ...

  7. [Python自学] day-19 (2) (Django-ORM)

    一.ORM的分类 ORM一般分为两类: 1.DB first:先在DB中创建数据库.表结构,然后自动生成代码中的类.在后续操作中直接在代码中操作相应的类即可. 2.Code first:直接在代码中实 ...

  8. [Python自学] day-19 (1) (FBV和CBV、路由系统)

    一.获取表单提交的数据 在 [Python自学] day-18 (2) (MTV架构.Django框架)中,我们使用过以下方式来获取表单数据: user = request.POST.get('use ...

  9. [Python自学] day-18 (2) (MTV架构、Django框架、模板语言)

    一.实现一个简单的Web服务器 使用Python标准库提供的独立WSGI服务器来实现MVC架构. 首先,实现一个简单的Web服务器: from wsgiref.simple_server import ...

  10. Python自学之路---Day13

    目录 Python自学之路---Day13 常用的三个方法 匹配单个字符 边界匹配 数量匹配 逻辑与分组 编译正则表达式 其他方法 Python自学之路---Day13 常用的三个方法 1.re.ma ...

随机推荐

  1. 简明Python3教程 13.面向对象编程

    简介 (注: OOP代表面向对象编程,OO代表面向对象,以后全部使用英文缩写) 迄今为止我们编写的所有程序都是围绕函数创建的,函数即操纵数据的语句块.这称作面向过程编程. 除此之外还有另一种组织程序的 ...

  2. SSH深度历险记(九) Struts2+DWZ+Uploadify多文件(文件和图片等。)上传

    在gxpt_uas系统,为了实现文件(文件和图片等.,灵活配置)批量上传到mongodb,在学习的过程中,知道mongodb,功能,实现思路:在DWZ的基础上參考官方的实例结合现有的GXPT来实现,期 ...

  3. python中string的操作函数

    在python有各种各样的string操作函数.在历史上string类在python中经历了一段轮回的历史.在最开始的时候,python有一个专门的string的module,要使用string的方法 ...

  4. MFC中获取App,MainFrame,Doc和View类等指针的方法

    From: http://hi.baidu.com/wxnxs/item/156a68f5b3b4ed18e3e3bd03   MFC中获取App,MainFrame,Doc和View类等指针的方法 ...

  5. .net 模拟发起HTTP请求(用于上传文件)

    用C#在服务端发起http请求,附上代码一 /// <summary> /// 文件帮助类 /// </summary> public class FileHelper { / ...

  6. wpf datagrid设置右键菜单打开时选中项的背景色

    原文:wpf datagrid设置右键菜单打开时选中项的背景色 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/huangli321456/artic ...

  7. Code First 连接已有数据库

    连接数据库                 生成结果并没有一个可视化界面(Model First有)     其他 连接数据库之后,可以采用migration管理第一次add-migration XX ...

  8. JDK源码阅读——LinkedList实现

    1 继承结构图 LinkedList是List的另一种实现.继承自AbstractSequentialList 2 数据结构 LinkedList与ArrayList不同的是LinkedList底层使 ...

  9. JS实时检测文本框内容长度

    通过js代码实时监测,文本框内容的变化以及长度,下图是一个实际使用场景. HTML部分: <input id="Text1" type="text" on ...

  10. 创建hexo风格的markdown页面

    最近在用 nodejs 搭建一个个人博客,博客当然要有编辑文章的功能啦.个人比较偏爱 hexo 风格的 markdown 格式,所以想自己的博客也是这样的风格.尝试了几个库,发现 marked 的转换 ...