Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion CommonMod/MyLog.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
144 changes: 133 additions & 11 deletions CommonMod/TcpSvr.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
# example
# t = TcpSvr()
# t.doTcpSvrStart()
Binary file added CommonMod/__pycache__/MyLog.cpython-38.pyc
Binary file not shown.
Binary file added CommonMod/__pycache__/PublicFunc.cpython-38.pyc
Binary file not shown.
Binary file added CommonMod/__pycache__/SysVar.cpython-38.pyc
Binary file not shown.
Binary file added CommonMod/__pycache__/TcpSvr.cpython-38.pyc
Binary file not shown.
Binary file added CommonMod/__pycache__/ThreadPool.cpython-38.pyc
Binary file not shown.
Binary file added CommonMod/__pycache__/TimerPoll.cpython-38.pyc
Binary file not shown.
Binary file added CommonMod/__pycache__/__init__.cpython-38.pyc
Binary file not shown.
6 changes: 5 additions & 1 deletion main.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from CommonMod.SysVar import *
from CommonMod.TimerPoll import *
from CommonMod.ThreadPool import *
from CommonMod.TcpSvr import *


@CapError
Expand All @@ -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))