-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsession.py
146 lines (116 loc) · 4.12 KB
/
session.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import socket
import threading
import time
import logging
# 自定义python
import huidiao.sunlink
BUFFERSIZE = 1024
class Session:
session = None
address = None
shutdown = True
logger = None
ended = False
parsemsg = None
handler = None
def __init__(self, addr, log_conf):
# 设置日志参数
logging.basicConfig(level = logging.INFO,format = '[%(asctime)s][%(funcName)s][%(levelname)s]: %(message)s')
self.logger = logging.getLogger('session')
self.parsemsg = huidiao.sunlink.ParseMsg()
# 设置TCP的客户端
self.session = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 设置socket超时(这里超时会报异常)
self.session.settimeout(1)
try:
self.address = addr
self.session.connect(addr)
except:
self.logger.warn('每2s尝试连接一次服务器')
tryThread = threading.Thread(target=self.tryConnect)
tryThread.start()
else:
self.logger.info('成功连接到服务器')
recvThread = threading.Thread(target=self.recvMsg)
recvThread.start()
self.shutdown = False
# 尝试连接到服务器
def tryConnect(self):
while not self.ended:
try:
self.session.connect(self.address)
except:
self.logger.warn('未发现服务器程序')
time.sleep(2)
else:
break
if not self.ended:
self.logger.info('服务器连接成功')
# 建立连接的标志
self.shutdown = False
# 启动接受数据线程
recvThread = threading.Thread(target=self.recvMsg)
recvThread.start()
def isConnect(self):
if self.shutdown:
return False
else:
return True
# 向服务器端发送数据
def sendMsg(self, msg_id, msg):
if msg == None:
return False
if self.shutdown:
return False
try:
# 将json消息序列化
inData = huidiao.sunlink.wrapper(msg_id, msg)
# 发送消息
self.session.send(inData)
except UnboundLocalError:
self.logger.error('socket is invalid')
return True
# 接收来自服务器的数据
def recvMsg(self):
while not self.ended:
try:
out_data = self.session.recv(BUFFERSIZE)
if len(out_data) == 0:
# 连接断开标志
self.shutdown = True
self.logger.warn('服务器程序断开')
break
# self.logger.info('返回数据信息:{!r}'.format(out_data))
except UnboundLocalError:
self.logger.error('socket is invalid')
except IOError:
# self.logger.error('socket timeout')
continue
self.parsemsg.pushData(out_data)
ret, msg_id, msg = self.parsemsg.parseMsg()
if not ret:
continue
if self.handler != None:
self.handler(msg_id, msg)
if not self.ended:
self.logger.info('尝试连接到服务器')
self.session = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
tryThread = threading.Thread(target=self.tryConnect)
tryThread.start()
def registerHandler(self, handler):
self.handler = handler
def exit(self):
try:
self.ended = True
# 好像使用shutdown还需要判断是否连接成功
if not self.shutdown:
# 0: rd, 1: wr, 2: rd_wr
self.session.shutdown(2)
self.shutdown = True
# 关闭连接
self.session.close()
self.logger.info('Session Exit!!!')
except UnboundLocalError:
self.logger.error('socket is invalid')
def isExit(self):
return self.ended