From d56b55fe1ead4301679de23a05bf8548a49d7bfd Mon Sep 17 00:00:00 2001 From: XK_VID Date: Tue, 26 Sep 2023 09:28:03 +0800 Subject: [PATCH] commit tcpsvr code1 --- CommonMod/MyLog.py | 4 +- CommonMod/TcpSvr.py | 144 ++++++++++++++++-- CommonMod/__pycache__/MyLog.cpython-38.pyc | Bin 0 -> 1070 bytes .../__pycache__/PublicFunc.cpython-38.pyc | Bin 0 -> 1247 bytes CommonMod/__pycache__/SysVar.cpython-38.pyc | Bin 0 -> 1123 bytes CommonMod/__pycache__/TcpSvr.cpython-38.pyc | Bin 0 -> 3441 bytes .../__pycache__/ThreadPool.cpython-38.pyc | Bin 0 -> 1677 bytes .../__pycache__/TimerPoll.cpython-38.pyc | Bin 0 -> 1413 bytes CommonMod/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 151 bytes main.py | 6 +- 10 files changed, 141 insertions(+), 13 deletions(-) create mode 100644 CommonMod/__pycache__/MyLog.cpython-38.pyc create mode 100644 CommonMod/__pycache__/PublicFunc.cpython-38.pyc create mode 100644 CommonMod/__pycache__/SysVar.cpython-38.pyc create mode 100644 CommonMod/__pycache__/TcpSvr.cpython-38.pyc create mode 100644 CommonMod/__pycache__/ThreadPool.cpython-38.pyc create mode 100644 CommonMod/__pycache__/TimerPoll.cpython-38.pyc create mode 100644 CommonMod/__pycache__/__init__.cpython-38.pyc diff --git a/CommonMod/MyLog.py b/CommonMod/MyLog.py index ac2e383..361f550 100644 --- a/CommonMod/MyLog.py +++ b/CommonMod/MyLog.py @@ -10,7 +10,9 @@ # debug标记, 减少日志打印 g_debug_leave = { "leave_0":True, # 默认打印日志 - "leave_1":False, # dump dev addr日志 + "leave_1":True, # TCP服务器内部日志 + + # 业务自定义日志 "leave_2":False, # dump task node日志 "leave_3":True, # 定时器日志 "leave_4":True, # 接收udp 22345 diff --git a/CommonMod/TcpSvr.py b/CommonMod/TcpSvr.py index 73eea0c..affa404 100644 --- a/CommonMod/TcpSvr.py +++ b/CommonMod/TcpSvr.py @@ -8,21 +8,143 @@ from CommonMod.PublicFunc import * from CommonMod.SysVar import * +class TcpSvr(object): + # 构造方法 + def __init__(self, svr_ip="0.0.0.0", svr_port=22345): + self.svr_ip = svr_ip + self.svr_port = svr_port -class TcpSvr(object): + # previte attr 私有属性 + self._listen_num = 1000 + self._cliaddr_map = {} + self._svr_sock = None + self._reg_funcs = {"accept":None, "recv":None, "close":None, "except":None} + self._select_timeout = 0.2 + self._recv_maxsize = 1024*1024*32 + + # select框架监听列表 + self._input_list = [] + self._output_list = [] + + # 开启绑定 + self._bind_sock() + + # 析构方法 + def __del__(self): + pass + + # 创建绑定套接字 + @CapError + def _bind_sock(self): + self._svr_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self._svr_sock.bind((self.svr_ip, self.svr_port)) + self._svr_sock.listen(self._listen_num) + self._svr_sock.setblocking(False) + my_print("bind svr addr {}:{}".format(self.svr_ip, self.svr_port), debug="leave_1") + + # 解绑定 + @CapError + def _unbind_sock(self): + pass + + # 重新绑定 + @CapError + def reBindSock(self, svr_ip="0.0.0.0", svr_port=22345): + pass + + # 开始监听sock处理任务 + @CapError + def doTcpSvrStart(self, args): + my_print("start tcp server, wait client connect ...", debug="leave_1") + + # 设置监听服务器sock + if self._svr_sock not in self._input_list: + self._input_list.append(self._svr_sock) + + # 开始轮询 + while isRuning(): + rl, wl, el = select.select( + self._input_list, self._output_list, self._input_list, self._select_timeout) + + # 处理可读 + for sock in rl: + # 处理一个新的连接 + if sock is self._svr_sock: + cli, addr = sock.accept() + self._accept_cli_link_handle(cli, addr) + continue - def __init__(self, svr_ip="0.0.0.0", svr_port=22345, cli_func=None): - self.svr_ip = svr_ip - self.svr_port = svr_port - if not cli_func: - self.cli_func = self.cli_default_handle - else: - self.cli_func = cli_func + # 处理接收客户端数据 + data = sock.recv(self._recv_maxsize) + if data: + self._recv_cli_data_handle(sock, data) + else: + # 没收到数据断开连接 + self._close_cli_sock_handle(sock, data) + + # 处理可写 --暂不处理 + # 处理异常 + for sock in el: + # 同断开连接处理 + self._close_cli_sock_handle(sock, data) - def cli_default_handle(cli, data): - my_print("recv data from ", cli.getpeername()) + # 退出服务器 return 0 + # 退出服务器 + + # 客户端连接请求处理方法 + @CapError + def _accept_cli_link_handle(self, cli, addr): + my_print("recv cli link from({}:{})".format(addr[0], addr[1]), debug="leave_1") + cli.setblocking(False) + self._input_list.append(cli) + self._cliaddr_map[cli] = addr + + if not self._reg_funcs["accept"]: + return 0 + + # 调用注册的函数 + return self._reg_funcs["accept"](cli, addr) + + # 接收客户端数据处理方法 + @CapError + def _recv_cli_data_handle(self, cli, data): + my_print("recv cli({}:{}) data :" + .format(self._cliaddr_map[cli][0], self._cliaddr_map[cli][1]), data, debug="leave_1") + + if not self._reg_funcs["recv"]: + return 0 + return self._reg_funcs["recv"](cli, data) + + # 客户端关闭处理方法 + @CapError + def _close_cli_sock_handle(self, cli, data): + my_print("cli({}:{}) will close" + .format(self._cliaddr_map[cli][0], self._cliaddr_map[cli][1]), debug="leave_1") + + # 关闭并移除连接客户端 + cli.close() + if cli in self._input_list: + self._input_list.remove(cli) + if cli in self._output_list: + self._output_list.remove(cli) + if cli in self._cliaddr_map.keys(): + del self._cliaddr_map[cli] + + if not self._reg_funcs["close"]: + return 0 + + return self._reg_funcs["close"](cli, data) + + + # 注册处理函数 + @CapError + def addCliHandleFunc(self, type=None, func=None): + self._reg_funcs[type] = func + return 0 -t = TcpSvr() \ No newline at end of file +# example +# t = TcpSvr() +# t.doTcpSvrStart() \ No newline at end of file diff --git a/CommonMod/__pycache__/MyLog.cpython-38.pyc b/CommonMod/__pycache__/MyLog.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6296cdd655f568f0ab34d2423f37e43952ce1e6e GIT binary patch literal 1070 zcmYjPOK;Oa5Z+zeiJc~CD}iVbLXl7;jA+EGJR*dUS^)=I0VyvNWVu-lo7#ojW2vvTHYGDwd0$CuhLHG$MfhMSic$uO$Ac}Vg+oxoT1({%~ z)nM!znjxcxPPLQ>jTWYOlKYEbC5J$i&?khNhver{s!g=1F^jUm58lsc1-(Zf&=(-I zjYMHuq$Ob>ntc06*Vq2Qg&`nsdE2JJL zklo0dkh%yWUz%L7o=|u!K60P&On26Nz9ZtK(+;8}^xq9T?b*2+M^U`H9@EbH@NL|0CPP++_!-2b9)xT#6KpnN^Kh^Qg|W24xa)m^cB2FuMlYwz4!*<3ld>jL?FY0FP8ITujph;y!td%|QTD uKX2A^7JsRl8jxir&F4`}_d@@LnuOOunJ{=6o4T$OOf-=H`){FIo&N{tF$a7A literal 0 HcmV?d00001 diff --git a/CommonMod/__pycache__/PublicFunc.cpython-38.pyc b/CommonMod/__pycache__/PublicFunc.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3e3dd2012fa8e78f4111d9de3172494ffe40f57 GIT binary patch literal 1247 zcmZWo&2HO95T4nkDN6N^Vx&M21g(tp5T=1naZwn75x{ZV05uUj?f1(Vnqn<>*qoq#dzx0bxTngeP3lxWID^ zJ%K&&n;!@h0v`?DE?Ku5qqXOYk>>NQ+w}4WoS;C#F1#65Hk}9YJhoQ0(ywTLOIyDt zA#lb7lzDmg4OCF!pJZ3$88Q7GX&f^&R6x>Qozd z^up?p6R<(~9*tvx-^0JVVyFLDOQmbse<1a!$nt(~IL;IKXxi`1^blw>9osorEISYObdR?FkwiTYK(vBxS8PTk>uaR3 zfVWT(nH9WaNN=^pDzuj1G&@f48L+*?0{1NNHzbH{N*3&#xG%6^=culeBtGZqWlPEU z_l_Q(5_L{zYip}!+2_jQgsq{rO|vu^Ps<|64kxM4j7te=l!PlMidetwL*0zJ51T@s zM3bZ#JdaY5$bm(-6?r76Biy5wm*4klh+pcELwUOF`2VvPHC>^6T5djSrGV5!}V0F z`s&6o)wzrdt<8 literal 0 HcmV?d00001 diff --git a/CommonMod/__pycache__/SysVar.cpython-38.pyc b/CommonMod/__pycache__/SysVar.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28121f57667714397c2382f3e3992b81ae973e81 GIT binary patch literal 1123 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 literal 0 HcmV?d00001 diff --git a/CommonMod/__pycache__/ThreadPool.cpython-38.pyc b/CommonMod/__pycache__/ThreadPool.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c77b4821c0ef84414289dc0801cd37b935e0745 GIT binary patch literal 1677 zcmaJ>&2J+$6t_K->EyF%Hyf!7LJ>%aaL5USv_cE0O;2elw9BGVR-@V2O|zY^+74~1 z^wbrcR^|AMbbNWF68#CuNLlpgTN&wd~Cp8b38`FXWkA}~III(gUa!o2?#!vxxpDCTZQQtYvzB2k zL>11Wswm8Aa}uo%NmRetuZeZO%2&AmhF;R(5pZ>0<`v5|fUEM_8v>fgob8kL+BKYt zv>mg4a3n><_p&VRo{7O&XVSQ*(MX%>SG``i`Ss3TuY1tl+C68TPMaF~@$lDQaQyMb zbpc!qC_1_sxOZS~!cq!91d#yWD@3blxlEOymg~~BeDp_|2*SQ`_C14wY0w_)UnR; z{{AS*W3e~s@87JOS(0SwPR9Goz@2_4wWgK##xpJ zg+oA>TksYHE8A2f&KJNOMC$l`5UDy4QgE3^n~qCe$D>b}d<3!qDsBg2fgUUt9voal z4Pfqv8mSC0~53Mv*NHej2r)k>_N$3tSDN-RoKTmU~xhlVBEIBKGd zn@1o;Sj_6(i_qDb^s=F8ECqYxSMg}DjlEM}O7|z~yGY7+Fama?aeLU97347u3#9$c zDDNU>i`N4i#@^u`Jot7<+jjovNyf*qc!u?$ujgD?ZEyqyGZI CbdYrb literal 0 HcmV?d00001 diff --git a/CommonMod/__pycache__/TimerPoll.cpython-38.pyc b/CommonMod/__pycache__/TimerPoll.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8a6e1ceb609a3db2a03306b6557a60a7b2e71ad GIT binary patch literal 1413 zcmZ`(&2AG(5bi&ZC(hVOAVMSp$r4B_Bjf{uAfbSe0()3N6mSr$k&!iVH)im7X6Wvb zuw^coJFnmzd8Lu|w5PlR7pQ6{Aql%}b#+yDbx(a?RryuDUL!DWd|Ffg_=Nn6#@Qjj zcns5g1|f;02??oNS;*YVL$3IHF|SB=NGba8#M@u2Ra_%q(fQILiE3(D3R(F=W;6_> zC#x!ubiiX8)#1dKOYWordQC1neFgMD)}6j8X@|5LM-T_uov?PhMN4|CPtiUesN>v$ zX%LqsGuV&>F4A4_uNAqBtlE!93M>J7^o{5Wcz%B%ud>fQ0gg&Q-Wa#Nl%OstW8Cw9c{OdX;Q#xf+KHwHSx5;aAkGvo+$=_fBRJJ?0 zX>6qJBEqCF&9_k!%iGN~8mVS%n(AY0A2h#-a%Hdxsno~P# zaN>|;{b5U#0-p#yz>yU;^c^0!tPz1Dav?l0%f|U2uEU-QKoAko8Wqf=SE*hB`?n;X za&Z?K)r%k9f(Oky2*P~dgE9%|I%9m3U*ZARS75)j7B1O$T165< z3E9YMbT7Gq+7)?Z-<4jJ=Ma0ja@w!$=i_JDpj`j8u~!@GqKE+?aKnlTp&S%t< literal 0 HcmV?d00001 diff --git a/CommonMod/__pycache__/__init__.cpython-38.pyc b/CommonMod/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1a5ed332ec85e2040de453aba246dac47472243 GIT binary patch literal 151 zcmWIL<>g`k0_9r4R1p0bL?8o3AjbiSi&=m~3PUi1CZpd2 zCSzPui?d7e3u1yZa|?1(11e*Jp|o>;Zf<^_Z+=Qle0*kJW=VX!UP0w84x8Nkl+v73 LJCLcLftUdR1?nT> literal 0 HcmV?d00001 diff --git a/main.py b/main.py index 9197906..8ab6b43 100644 --- a/main.py +++ b/main.py @@ -7,6 +7,7 @@ from CommonMod.SysVar import * from CommonMod.TimerPoll import * from CommonMod.ThreadPool import * +from CommonMod.TcpSvr import * @CapError @@ -23,9 +24,12 @@ def main(argv): initThreadPool() addThreadTask(test, wloop=True) addThreadTask(doTimerTaskStart, wloop=True) - loopThreatWait() + # tcp svr + tsvr = TcpSvr() + addThreadTask(tsvr.doTcpSvrStart, wloop=True) + loopThreatWait() if __name__ == "__main__": sys.exit(main(sys.argv)) \ No newline at end of file