您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

python中的异步网络框架socketserver

时间:2020-07-18 18:38:46  来源:  作者:

简介

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

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

一个小例子

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

server.py

#_*_ coding: utf-8 _*_
import SocketServer

class 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后输出如下

技术干货,python中的异步网络框架socketserver

输出结果

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

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

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

Traceback (most recent call last):
  File "server.py", line 12, in <module>
    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 SocketServer

class 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 = True

if __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 SocketServer

class 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()

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



Tags:socketserver   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
简介SocketServer是python基础库中提供的高级应用库, 主要用来编写异步服务程序. 最近工作原因需要写虚拟的外围服务程序, 正好了解到了这个, 所以写篇文章记录一下使用心得...【详细内容】
2020-07-18  Tags: socketserver  点击:(75)  评论:(0)  加入收藏
原创:志学Python http://985.so/bVgXSocketServer简化了网络服务器的编写。在进行socket创建时,使用SocketServer会大大减少创建的步骤,并且SocketServer使用了select它有4个类...【详细内容】
2019-09-19  Tags: socketserver  点击:(123)  评论:(0)  加入收藏
▌简易百科推荐
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Python阿杰    Tags:FastAPI   点击:(6)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  java老人头    Tags:框架   点击:(12)  评论:(0)  加入收藏
今天来梳理下 Spring 的整体脉络啦,为后面的文章做个铺垫~后面几篇文章应该会讲讲这些内容啦 Spring AOP 插件 (了好久都忘了 ) 分享下 4ye 在项目中利用 AOP + MybatisPlus 对...【详细内容】
2021-12-07  Java4ye    Tags:Spring   点击:(14)  评论:(0)  加入收藏
&emsp;前面通过入门案例介绍,我们发现在SpringSecurity中如果我们没有使用自定义的登录界面,那么SpringSecurity会给我们提供一个系统登录界面。但真实项目中我们一般都会使用...【详细内容】
2021-12-06  波哥带你学Java    Tags:SpringSecurity   点击:(18)  评论:(0)  加入收藏
React 简介 React 基本使用<div id="test"></div><script type="text/javascript" src="../js/react.development.js"></script><script type="text/javascript" src="../js...【详细内容】
2021-11-30  清闲的帆船先生    Tags:框架   点击:(19)  评论:(0)  加入收藏
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  叼着猫的鱼    Tags:框架   点击:(21)  评论:(0)  加入收藏
TKinterThinter 是标准的python包,你可以在linx,macos,windows上使用它,你不需要安装它,因为它是python自带的扩展包。 它采用TCL的控制接口,你可以非常方便地写出图形界面,如...【详细内容】
2021-11-30    梦回故里归来  Tags:框架   点击:(27)  评论:(0)  加入收藏
前言项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文...【详细内容】
2021-11-17  充满元气的java爱好者  博客园  Tags:SpringBoot   点击:(25)  评论:(0)  加入收藏
一、搭建环境1、创建数据库表和表结构create table account(id INT identity(1,1) primary key,name varchar(20),[money] DECIMAL2、创建maven的工程SSM,在pom.xml文件引入...【详细内容】
2021-11-11  AT小白在线中  搜狐号  Tags:开发框架   点击:(29)  评论:(0)  加入收藏
SpringBoot开发的物联网通信平台系统项目功能模块 功能 说明 MQTT 1.SSL支持 2.集群化部署时暂不支持retain&will类型消 UDP ...【详细内容】
2021-11-05  小程序建站    Tags:SpringBoot   点击:(56)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条