pyhton socketserver

网上找到一段代码 关于 socketserver 的使用
本来想用C++ 和 libevent 写,libevent 对linux 支持的很好,macos 支持的也可以,但是windows 有点不太尽如人意,Qt 框架的 又得被迫开源一些东西,也很烦
先用python 写一个示例,先凑合着用

import socketserverclass MyServer(socketserver.BaseRequestHandler):def handle(self):conn = self.requesttry:conn.sendall("good?".encode())Flag = Truewhile Flag:data = conn.recv(1024)if data == "exit":Flag = Falseelif data == "0":conn.sendall("verygood?".encode())else:conn.sendall("goodgood?".encode())except:print("Okay I will close connect")conn.close()if __name__ == "__main__":server = socketserver.ThreadingTCPServer(("127.0.0.1", 40000), MyServer)server.serve_forever()

server example 有一些问题

需要重写一个 TCP SERVER 的基类重新,构造ThreadTcpServer 和 ThreadUdpServer

import socketserver
import logging
import socket
from enum import Enumclass NetWorkTransType(Enum):TCP = 0x1UDP = 0x2class NetWorkWorkType(Enum):CLIENT = 0x1SERVER = 0x2class NetWorkCFG:ip: strport: inttransType: NetWorkTransTypeworkType: NetWorkWorkTypedef __init__(self, ip: str, port: int, transType: NetWorkTransType, workType: NetWorkWorkType):self.ip = ipself.port = portself.transType = transTypeself.workType = workTypeclass NetWorkHandle(socketserver.BaseRequestHandler):__heartbeat_en__ = False__readwrite_en__ = False__alarm_en__ = False__call_heartbeat__ = None__call_readwrite__ = None__call_alarm__ = None__trans_flag__: NetWorkTransType__login_en__ = False__call_login__ = Nonedef setTransFlag(self, flag: NetWorkTransType):self.__trans_flag__ = flagdef handle(self) -> None:conn = self.requestrecvDATA = b"\x00"sendDATA = b"\x00"status = Falsetry:if self.__trans_flag__ == NetWorkTransType.TCP:recvDATA = conn.recv(4096)elif self.__trans_flag__ == NetWorkTransType.UDP:recvDATA, _ = conn[0].recvfrom(4096)while True:if self.__login_en__ and self.__call_login__ is not None:status, sendDATA = self.__call_login__(recvDATA)if status is True:breakif self.__heartbeat_en__ and self.__call_heartbeat__ is not None:# positivate recv heartbeatstatus, sendDATA = self.__call_heartbeat__(recvDATA)if self.__alarm_en__ and self.__call_alarm__ is not None:status, sendDATA = self.__call_alarm__(recvDATA)if self.__readwrite_en__ and self.__call_readwrite__ is not None:status, sendDATA = self.__call_readwrite__(recvDATA)breakif self.__trans_flag__ == NetWorkTransType.TCP:conn.sendall(sendDATA)elif self.__trans_flag__ == NetWorkTransType.UDP:conn[0].sendto(sendDATA, conn[1])except (ConnectionResetError,ConnectionRefusedError,ConnectionAbortedError,ConnectionError,) as err:if self.__trans_flag__ == NetWorkTransType.TCP:logging.error("%s:%s" % (self.client_address[0], err.strerror))conn.close()elif self.__trans_flag__ == NetWorkTransType.UDP:logging.error("%s:%s" % conn[1], err.strerror)conn[0].close()# enable alarm threaddef alarmEnable(self, enable: bool):self.__alarm_en__ = enable# enable readwrite threaddef readwriteEnable(self, enable: bool):self.__readwrite_en__ = enable# enable hearbeat threaddef hearbeatEnable(self, enable: bool):self.__heartbeat_en__ = enabledef set_callHeartBeat(self, func):self.__call_heartbeat__ = funcdef set_callReadWrite(self, func):self.__call_readwrite__ = funcdef set_callAlarm(self, func):self.__call_alarm__ = funcdef set_callLogin(self, func):self.__call_login__ = funcdef loginEnable(self, enable: bool):self.__login_en__ = enableclass NetWork:__heartbeat_en__ = False__readwrite_en__ = False__alarm_en__ = False__config__: NetWorkCFG__call_heartbeat__ = None__call_readwrite__ = None__call_alarm__ = None__handle__ = None__server__ = None__login_en__ = False__call_login__ = Falsedef __init__(self, config: NetWorkCFG):self.__config__ = configdef overrideNETWORK_CFG(self, config: NetWorkCFG):self.__config__ = configdef set_callHeartBeat(self, func):self.__call_heartbeat__ = funcdef set_callReadWrite(self, func):self.__call_readwrite__ = funcdef set_callAlarm(self, func):self.__call_alarm__ = funcdef set_callLogin(self, func):self.__call_login__ = funcdef loginEnable(self, enable: bool):self.__login_en__ = enable# enable alarm threaddef alarmEnable(self, enable: bool):self.__alarm_en__ = enable# enable readwrite threaddef readwriteEnable(self, enable: bool):self.__readwrite_en__ = enable# enable hearbeat threaddef hearbeatEnable(self, enable: bool):self.__heartbeat_en__ = enabledef setHandle(self, handle):self.__handle__ = handledef GETtransType(self):return self.__config__.transTypedef GETworkType(self):return self.__config__.workType# TODO: client work will adddef start(self):if self.__handle__ is None:returnif self.__config__.transType == NetWorkTransType.TCP:if self.__config__.workType == NetWorkWorkType.SERVER:self.__server__ = socketserver.ThreadingTCPServer((self.__config__.ip, self.__config__.port), self.__handle__)elif self.__config__.workType == NetWorkWorkType.CLIENT:passelif self.__config__.transType == NetWorkTransType.UDP:if self.__config__.workType == NetWorkWorkType.SERVER:self.__server__ = socketserver.ThreadingUDPServer((self.__config__.ip, self.__config__.port), self.__handle__)elif self.__config__.workType == NetWorkWorkType.CLIENT:passif self.__server__ is not None:self.__server__.serve_forever()

修改方法
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/156340.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

激光雷达和人工智能

几十年来,激光雷达一直是许多行业中非常有用的工具,但直到最近,随着人工智能(AI)解决方案的引入,我们才开始认识到它的真正潜力。激光雷达,又称光探测和测距,是一种遥感技术。它利用…

@echo off 的作用

echo off 的作用 表示关闭批处理文件自身的回显,即执行此句之后的命令不会显示出来,只有输出结果会被显示 整体的理解就是 执行的命令不显示了,显示执行命令后的结果 其中, 表示关闭命令回显功能,即命令执行时不在…

高效处理异常值的算法:One-class SVM模型的自动化方案

一、引言 数据清洗和异常值处理在数据分析和机器学习任务中扮演着关键的角色。清洗数据可以提高数据质量,消除噪声和错误,从而确保后续分析和建模的准确性和可靠性。而异常值则可能对数据分析结果产生严重影响,导致误导性的结论和决策。因此&…

【JavaEE初阶】 认识文件与Java中操作文件

文章目录 🌴认识文件🚩树型结构组织和目录🚩文件路径(Path)🚩知识扩展 🎍Java 中操作文件🚩File 概述📌属性📌构造方法📌方法 🚩File使…

优思学院|RCA(根本原因分析)四大步骤

在现代的制造业或者甚至是商业环境中,问题和突发事件不可避免地出现。 为了有效地解决这些问题并防止它们再次发生,根本原因分析(RCA)成为了至关重要的工具。 RCA是一种系统性的方法,涉及数据采集、因果图、根本原因…

el-dropdown自定义样式,不影响其他组件

原来的样式: 修改后的样式: 给el-dropdown-menu添加类名dropdown-menu <el-dropdown-menu slot"dropdown" class"dropdown-menu"><router-link to"/user/profile"><el-dro…

Linu之VM及WindowsServer安装

# 1.操作系统 ## 1.1.什么是操作系统 操作系统&#xff08;Operating System&#xff0c;简称OS&#xff09;是一种系统软件&#xff0c;它是计算机硬件和应用软件之间的桥梁。它管理计算机的硬件和软件资源&#xff0c;为应用程序提供接口和服务&#xff0c;并协调应用程序的…

自动化混沌工程 ChaosMeta V0.6 版本发布

混沌工程 ChaosMeta 的全新版本 V0.6.0 现已正式发布&#xff01;该版本包含了许多新特性和增强功能&#xff0c;在编排界面提供了包括流量注入、度量等各类节点的支持&#xff0c;可视化支撑演练全流程。解决混沌工程原则中“持续自动化运行实验”的最后一公里问题。 简介 Ch…

CPU就绪情况及其对虚拟机性能的影响

CPU就绪是虚拟化中的一种性能度量&#xff0c;用于指示物理CPU中的潜在问题&#xff0c;作为对系统效率的度量&#xff0c;它用于跟踪性能和资源利用率&#xff0c;并避免严重错误。为了理解它在管理虚拟机中的重要性&#xff0c;我们将探讨CPU就绪作为一种性能指标的作用。 让…

【Python语言速回顾】——爬虫基础知识

目录 一、爬虫概述 1、准备工作 2、爬虫类型 3、爬虫原理 二、爬虫三大库 1、Requests库 2、BeautifulSoup库 3、Lxml库 一、爬虫概述 爬虫又称网络机器人&#xff0c;可以代替人工从互联网中采集、整理数据。常见的网络爬虫主要有百度公司的Baiduspider、360公司的36…

AI赋能,轻松出爆文!AI新闻创作新时代,你准备好了吗?

众所周知&#xff0c;传统新闻报道需要大量的人工参与&#xff0c;不仅耗时耗力&#xff0c;还对媒体工作者的文字功底和知识积累有很高的要求。但随着人工智能技术的发展&#xff0c;大模型在新闻写作领域展现出强大的潜力。通过AI写作技术&#xff0c;在很大程度上实现了新闻…

苹果AirTag平替产品选择,国内外支持苹果Find My芯片功耗全面对比

2021年4月20,苹果在春季产品发布会上推出了全新的产品类型- AirTag,将哆啦A梦的追踪徽章带到了现实。这个小产品当年并没有像其它苹果新品那样一朝爆红。随着年轮缓缓而坚定地前行, AirTag也缓缓而坚定地前行,并被越来越多的人接受和喜欢。 深入思考AirTag背后的产品逻辑和实现…