简介

SocketServer是python基础库中提供的高级应用库, 主要用来编写异步服务程序. 最近工作原因需要写虚拟的外围服务程序, 正好了解到了这个, 所以写篇文章记录一下使用心得

在python3中SocketServer模块被改名为了socketserver模块

一个小例子

从一个小例子开始讲起, 一个小型回显服务器

server.py

#_*_ coding: utf-8 _*_import SocketServerclass FooHandler(SocketServer.BaseRequestHandler):    def handle(self):        # 'self.request'为客户端socket, 可以调用recv, send方法接收或发送数据        data = self.request.recv(30).strip()        print('From (%s:%s) msg:%s' % (self.client_address[0], self.client_address[1], data))if __name__ == '__main__':    server = SocketServer.TCPServer(('127.0.0.1', 8000), FooHandler)    server.serve_forever()

运行python server.py后输出如下

输出结果

可以看到我们只使用了不到20行的代码便实现了一个小型的异步服务器

需要注意这个程序客户端发起一次数据后客户会话就会关闭

在实际实验中, 可能我们在启动服务程序的时候经常会发生以下异常, 大多数原因是因为服务程序结束后, listen_socket进入TIME_WAIT状态, 导致第二次启动的时候会提示端口已经被占用了

Traceback (most recent call last):  File "server.py", line 12, in     server = SocketServer.ThreadingTCPServer(('127.0.0.1', 8000), FooHandler)  File "/usr/lib/python2.7/SocketServer.py", line 417, in __init__    self.server_bind()  File "/usr/lib/python2.7/SocketServer.py", line 431, in server_bind    self.socket.bind(self.server_address)  File "/usr/lib/python2.7/socket.py", line 228, in meth    return getattr(self._sock,name)(*args)socket.error: [Errno 98] Address already in use

了解了异常产生的原因后, 其实就可以找到对应的解决方法了. 将服务listen_socket的SO_REUSEADDR属性打开即可, 由于SocketServer并没有直接将listen_socket暴露出来, 所以可能不方便直接操作listen_socket, 但是官方提供了一种方法, 就是写一个继承SocketServer.TCPServer的子类, 然后将子类的allow_reuse_address设置为True

修改一下我们的程序server.py, 代码如下

#_*_ coding: utf-8 _*_import SocketServerclass FooHandler(SocketServer.BaseRequestHandler):    def handle(self):        # 'self.request'为客户端socket, 可以调用recv, send方法接收或发送数据        data = self.request.recv(30).strip()        print('From (%s:%s) msg:%s' % (self.client_address[0], self.client_address[1], data))class SimpleServer(SocketServer.TCPServer):    # 开启监听套接字的SO_REUSEADDR属性, 此属性在'SocketServer.TCPServer'中是默认关闭的    allow_reuse_address = Trueif __name__ == '__main__':    server = SimpleServer(('127.0.0.1', 8000), FooHandler)    server.serve_forever()

SocketServer.BaseRequestHandler一共有三个方法可以override

  1. setup 处理前回调, 用于给连接socket设置一些必要的属性, 比如socket.setblocking(0)
  2. handle 处理时回调, 定义服务器与客户端交互的逻辑
  3. finish 处理后回调, 用于定义关闭连接后的清理操作

ThreadingTCPServer

之前例子中编写的服务器程序只能用于同时处理一个连接, 当使用多个客户一起连接时会发现后续的客户端会被阻塞住, 如果想要处理多个客户请求时, 需要使用到SocketServer.ThreadingTCPServer

thread_server.py

import SocketServerclass FooHandler(SocketServer.BaseRequestHandler):    def handle(self):        # 'self.request'为客户端socket, 可以调用recv, send方法接收或发送数据        data = self.request.recv(30).strip()        print('From (%s:%s) msg:%s' % (self.client_address[0], self.client_address[1], data))if __name__ == '__main__':    server = ThreadingTCPServer(('127.0.0.1', 8000), FooHandler)    server.serve_forever()

如果喜欢我的文章点赞关注下哦!

erlang 怎么获得socket中的属性_技术干货,python中的异步网络框架socketserver相关推荐

  1. python中的命名空间_深入理解Python中的命名空间和范围

    Python中的命名空间和范围 在Python中,每个包.模块.类.函数和方法函数都拥有一个"名称空间",其中解析了变量名称.下面本篇文章就来带大家认识一下Python中的命名空间 ...

  2. python中输入字符串_简单讲解Python中的字符串与字符串的输入输出

    简单讲解Python中的字符串与字符串的输入输出 发布于 2016-03-26 14:35:42 | 110 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向 ...

  3. python类中没有属性_如何在python语言中在类中删除属性和添加属性

    在python语言中的类,可以使用class定义类,调用__init__方法进行初始化:默认传入self,可以在后面在添加几个属性.可以使用setattr()添加属性,也可以使用delattr()删除 ...

  4. java中display中的属性_浅谈CSS3中display属性的Flex布局

    最近在学习微信小程序,在设计首页布局的时候,新认识了一种布局方式display:flex 1 .container { 2 display: flex; 3 flex-direction: colum ...

  5. python3提取字符串中的数字_如何在Python中从字符串中提取数字?

    14 回复 | 直到 1 年前 1 430 3 年前 如果只想提取正整数,请尝试以下操作: >>> str = "h3110 23 cat 444.4 rabbit 11 ...

  6. python中整型_实例介绍Python中整型

    实例介绍Python中整型 Python中有以下几个基本的数据类型: 整数 int 字符串 str 浮点数 float 集合 set 列表 list 元组 tuple 字典 dict 布尔类型 boo ...

  7. python中获取文件大小_如何在Python中获取文件大小

    python中获取文件大小 We can get file size in Python using the os module. 我们可以使用os模块在Python中获取文件大小. Python中的 ...

  8. python中自定义错误_在现代Python中声明自定义异常的正确方法?

    在现代Python中声明自定义异常类的正确方法是什么?我的主要目标是遵循其他异常类所具有的任何标准,以便(例如)由捕获异常的任何工具打印出异常中包含的任何额外字符串. 所谓"现代Python ...

  9. python中add函数_如何使用python中的add函数?

    之前向大家介绍过python中的求和函数sum函数,numpy中的sum函数,对于数组可以指定维度进行相加.numpy中还有另一种求和运算方法,即add函数.add函数不仅作用于numpy中加法运算, ...

最新文章

  1. 简单的链式语法及实际运用(链式编程的基本原理)
  2. php mysql随机记录,php – 从MySQL中选择可变数量的随机记录
  3. C++计算nCr模p表达式如n! / (r! * (n-r)!)的实现算法(附完整源码)
  4. Windows 11 预览版 Build 22000.120 发布
  5. .NET Worker Service 作为 Windows 服务运行及优雅退出改进
  6. python split函数 空格_Python随笔29:Python基础编程练习题23~24
  7. Python报错: RuntimeError: The current Numpy installation (‘D:\\Develop\\anaconda\\lib\\site-packages\\
  8. CentOS 7.6虚拟机ping: www.baidu.com: Name or service not known
  9. ccc tiledmap
  10. 计算机绘图说课视频,机械图识读与计算机绘图说课PPT课件.ppt
  11. C语言程序——标准输出格式
  12. FileZilla的下载与安装
  13. ARM 编译工具keil 和 IAR 命令行编译和下载
  14. linux下qt软件使用方法,QT入门 QT Creator 使用
  15. 天地图如何导出某个区域_如何利用ArcGIS提取天地图建筑轮廓
  16. 《途客圈创业记:不疯魔,不成活》一一1.3 iWeekend创业周末
  17. 四川翌加:抖音发日常和发作品哪里不一样
  18. BZOJ5341[Ctsc2018]暴力写挂——边分治+虚树+树形DP
  19. u8 系统服务器配置,用友u8服务器配置推荐
  20. 【Python项目】Python实现一个亲戚关系计算器,过年回家再也不要怕叫错人了 | 附带源码

热门文章

  1. 2021暑假每日一题 【week2 完结】
  2. 3.2.1 虚拟内存的基本概念
  3. 2.3.8 吸烟者问题
  4. MySQL同时添加多条记录
  5. Java的13个规范
  6. powershell提取html字段,Windows PowerShell:PowerShell 中的 HTML 报告
  7. 哇塞!给 IDEA 换个酷炫的主题
  8. 后端程序员必备:书写高质量SQL的30条建议
  9. 操蛋的linux改mysql密码(1054和1819错误)
  10. html页面提交数据,利用servlet接收数据并写进xml中