一、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. 矩阵十点【两】 poj 1575 Tr A poj 3233 Matrix Power Series

    poj 1575  Tr A 主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1575 题目大意:A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的 ...

  2. Leetcode 104 Maximum Depth of Binary Tree 二叉树

    计算二叉树的最大深度 我的方法是找出两个子树的长度中最长的那个,然后加1 class Solution { public: int maxDepth(TreeNode* root) { ; ,maxD ...

  3. VC除零异常(错误)捕获

    // testFinally.cpp : Defines the entry point for the console application. // #include "stdafx.h ...

  4. OpenGL(十一) BMP真彩文件的显示和复制操作

    glut窗口除了可以绘制矢量图之外,还可以显示BMP文件,用函数glDrawPixels把内存块中的图像数据绘制到窗口上,glDrawPixels函数原型: glDrawPixels (GLsizei ...

  5. Android blueZ HCI(一个):hciconfig实施和经常使用

    关键词:hciconfighcitool  hcidump笔者:xubin341719(欢迎转载,请明确说明,请尊重版权,谢谢.)欢迎指正错误,共同学习.共同进步! . Android blueZ H ...

  6. Servlet 3.1实践

    Servlet 3.1 新特性详解 参考: IBM developerworks: Servlet 3.0 新特性详解 开涛的博客: Servlet3.1规范(最终版) 关键特性 Asynchroni ...

  7. redis SERVER INSTALL WINDOWS SERVICE

    以管理 员身份 运行 CMD 命令,进入redis所在目录,并运行下 脚本redis-server --service-install redis.windows-service.conf --log ...

  8. WPF 启动唯一程序(项目,exe,实例)

    原文:WPF 启动唯一程序(项目,exe,实例) 描述:用户多次快速开启WPF程序的时候  只运行起来 一个 程序(exe) 其他多开的 进程 自动关闭掉 App.xaml.cs文件 protecte ...

  9. Expression Blend学习动画基础

    原文:Expression Blend学习动画基础 什么是动画(Animation)? 动画就是时间+换面的组合,画面跟着时间变化.最常见的是flash的动画,还有GIF动态图片. 动画的主要元素 时 ...

  10. SQL Server 命名实例更改端口进行发布订阅

    原文:SQL Server 命名实例更改端口进行发布订阅 两台数据库服务器,都没有加入域,都安装多实例,端口也不一样了.现在使用命名实例进行复制,折腾了好久,才发现解决方法. 服务器A:myserve ...