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 0000000..6296cdd Binary files /dev/null and b/CommonMod/__pycache__/MyLog.cpython-38.pyc differ diff --git a/CommonMod/__pycache__/PublicFunc.cpython-38.pyc b/CommonMod/__pycache__/PublicFunc.cpython-38.pyc new file mode 100644 index 0000000..c3e3dd2 Binary files /dev/null and b/CommonMod/__pycache__/PublicFunc.cpython-38.pyc differ diff --git a/CommonMod/__pycache__/SysVar.cpython-38.pyc b/CommonMod/__pycache__/SysVar.cpython-38.pyc new file mode 100644 index 0000000..28121f5 Binary files /dev/null and b/CommonMod/__pycache__/SysVar.cpython-38.pyc differ diff --git a/CommonMod/__pycache__/TcpSvr.cpython-38.pyc b/CommonMod/__pycache__/TcpSvr.cpython-38.pyc new file mode 100644 index 0000000..49ae0de Binary files /dev/null and b/CommonMod/__pycache__/TcpSvr.cpython-38.pyc differ diff --git a/CommonMod/__pycache__/ThreadPool.cpython-38.pyc b/CommonMod/__pycache__/ThreadPool.cpython-38.pyc new file mode 100644 index 0000000..4c77b48 Binary files /dev/null and b/CommonMod/__pycache__/ThreadPool.cpython-38.pyc differ diff --git a/CommonMod/__pycache__/TimerPoll.cpython-38.pyc b/CommonMod/__pycache__/TimerPoll.cpython-38.pyc new file mode 100644 index 0000000..f8a6e1c Binary files /dev/null and b/CommonMod/__pycache__/TimerPoll.cpython-38.pyc differ diff --git a/CommonMod/__pycache__/__init__.cpython-38.pyc b/CommonMod/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..f1a5ed3 Binary files /dev/null and b/CommonMod/__pycache__/__init__.cpython-38.pyc differ 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