erlang 怎么获得socket中的属性_技术干货,python中的异步网络框架socketserver
简介
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
- setup 处理前回调, 用于给连接socket设置一些必要的属性, 比如socket.setblocking(0)
- handle 处理时回调, 定义服务器与客户端交互的逻辑
- 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相关推荐
- python中的命名空间_深入理解Python中的命名空间和范围
Python中的命名空间和范围 在Python中,每个包.模块.类.函数和方法函数都拥有一个"名称空间",其中解析了变量名称.下面本篇文章就来带大家认识一下Python中的命名空间 ...
- python中输入字符串_简单讲解Python中的字符串与字符串的输入输出
简单讲解Python中的字符串与字符串的输入输出 发布于 2016-03-26 14:35:42 | 110 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向 ...
- python类中没有属性_如何在python语言中在类中删除属性和添加属性
在python语言中的类,可以使用class定义类,调用__init__方法进行初始化:默认传入self,可以在后面在添加几个属性.可以使用setattr()添加属性,也可以使用delattr()删除 ...
- java中display中的属性_浅谈CSS3中display属性的Flex布局
最近在学习微信小程序,在设计首页布局的时候,新认识了一种布局方式display:flex 1 .container { 2 display: flex; 3 flex-direction: colum ...
- python3提取字符串中的数字_如何在Python中从字符串中提取数字?
14 回复 | 直到 1 年前 1 430 3 年前 如果只想提取正整数,请尝试以下操作: >>> str = "h3110 23 cat 444.4 rabbit 11 ...
- python中整型_实例介绍Python中整型
实例介绍Python中整型 Python中有以下几个基本的数据类型: 整数 int 字符串 str 浮点数 float 集合 set 列表 list 元组 tuple 字典 dict 布尔类型 boo ...
- python中获取文件大小_如何在Python中获取文件大小
python中获取文件大小 We can get file size in Python using the os module. 我们可以使用os模块在Python中获取文件大小. Python中的 ...
- python中自定义错误_在现代Python中声明自定义异常的正确方法?
在现代Python中声明自定义异常类的正确方法是什么?我的主要目标是遵循其他异常类所具有的任何标准,以便(例如)由捕获异常的任何工具打印出异常中包含的任何额外字符串. 所谓"现代Python ...
- python中add函数_如何使用python中的add函数?
之前向大家介绍过python中的求和函数sum函数,numpy中的sum函数,对于数组可以指定维度进行相加.numpy中还有另一种求和运算方法,即add函数.add函数不仅作用于numpy中加法运算, ...
最新文章
- 简单的链式语法及实际运用(链式编程的基本原理)
- php mysql随机记录,php – 从MySQL中选择可变数量的随机记录
- C++计算nCr模p表达式如n! / (r! * (n-r)!)的实现算法(附完整源码)
- Windows 11 预览版 Build 22000.120 发布
- .NET Worker Service 作为 Windows 服务运行及优雅退出改进
- python split函数 空格_Python随笔29:Python基础编程练习题23~24
- Python报错: RuntimeError: The current Numpy installation (‘D:\\Develop\\anaconda\\lib\\site-packages\\
- CentOS 7.6虚拟机ping: www.baidu.com: Name or service not known
- ccc tiledmap
- 计算机绘图说课视频,机械图识读与计算机绘图说课PPT课件.ppt
- C语言程序——标准输出格式
- FileZilla的下载与安装
- ARM 编译工具keil 和 IAR 命令行编译和下载
- linux下qt软件使用方法,QT入门 QT Creator 使用
- 天地图如何导出某个区域_如何利用ArcGIS提取天地图建筑轮廓
- 《途客圈创业记:不疯魔,不成活》一一1.3 iWeekend创业周末
- 四川翌加:抖音发日常和发作品哪里不一样
- BZOJ5341[Ctsc2018]暴力写挂——边分治+虚树+树形DP
- u8 系统服务器配置,用友u8服务器配置推荐
- 【Python项目】Python实现一个亲戚关系计算器,过年回家再也不要怕叫错人了 | 附带源码