700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > python-socket-服务端一对多客户端断线自动重连 自动收发消息示例

python-socket-服务端一对多客户端断线自动重连 自动收发消息示例

时间:2019-09-15 20:33:29

相关推荐

python-socket-服务端一对多客户端断线自动重连 自动收发消息示例

客户端代码:

import socketimport threadingimport timeimport tracebackclass ElevClient(threading.Thread):def __init__(self, eClientId, host, port):threading.Thread.__init__(self, name="elevClient_" + eClientId)self.host = hostself.port = port # config.ZLAN_SERVER_PORTself.sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)def run(self):self.doConnect()while True:try:self.recv_msg()self.send_msg()except OSError:traceback.print_exc()time.sleep(2)print('socket connect error, doing connect in 2s .... host/port:{}/{}'.format(self.host, self.port))self.sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.doConnect()except Exception as e:print('other error occur:{}'.format(e))traceback.print_exc()time.sleep(4)self.doConnect()def doConnect(self):while True:try:self.sck.connect((self.host, self.port))time.sleep(1)print('-----------------------------------------')print('client start connect to host/port:{}/{}'.format(self.host, self.port))print('-----------------------------------------')breakexcept ConnectionRefusedError:print('socket server refused or not started, reconnect to server in 3s .... host/port:{}/{}'.format(self.host, self.port))time.sleep(3)except Exception as e:traceback.print_exc()print('do connect error:{}'.format(str(e)))time.sleep(5)def send_msg(self):try:time.sleep(1)msg = str(time.time())self.sck.send(msg.encode())print('send msg:', msg)except Exception as e:print('send_msg:{}'.format(e))self.sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.doConnect()def recv_msg(self):try:data = self.sck.recv(1024)if data:print('recv data:{}'.format(data))else:print('data is none')time.sleep(1)except Exception as e:print('recv_msg:{}'.format(e))self.sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.doConnect()if __name__ == '__main__':elevClient = ElevClient('1', '127.0.0.1', 8787).start()pass

服务端代码:

import jsonimport loggingimport tracebackfrom threading import Threadimport socketimport threadingimport timelogger = loggingclass ElevStatusWsServer(Thread):def __init__(self, host, port):Thread.__init__(self, name="ElevStatusServer")self.host = hostself.port = portself.logger = loggerself.jsonTemplate = {"Command": "FORWARD_ELEV_INFO","DeviceId": "C0002T","ElevId": 1,}self.seqNo = 1self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)def run(self):self.doConnect()while True:try:client, addr = self.server.accept()# self.recv_msg(client, addr)threading.Thread(target=self.send_msg, args=(client, addr)).start()threading.Thread(target=self.recv_msg, args=(client, addr)).start()print(threading.enumerate())except socket.error:traceback.print_exc()print('socket connect error, doing connect 2s host/port:{}/{}'.format(self.host, self.port))time.sleep(2)except Exception as e:print('other error occur:{}'.format(e))time.sleep(2)def doConnect(self):while True:try:# 防止socket server重启后端口被占用(socket.error: [Errno 98] Address already in use)self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)self.server.bind((self.host, self.port))self.server.listen(5)print('-----------------------------------------------------------')print("esWsServer host:{}/port:{} started listen...".format(self.host, self.port))print('-----------------------------------------------------------')breakexcept Exception as e:time.sleep(1)print('start ws server error:{}'.format(str(e)))traceback.print_exc()def recv_msg(self, client, addr):try:# self.send_msg(client, addr)print('Accept new connection from {0}'.format(addr))while 1:data = client.recv(1024)msg = eval(data.decode("utf-8"))print('recv msg:', msg)except Exception as e:print('recv_msg:{}'.format(e))# client.close()def send_msg(self, client, addr):try:while 1:time.sleep(1)elevStatusDict = self.jsonTemplate.copy()msg2Elev = json.dumps(elevStatusDict).encode() + "\n".encode()client.sendto(msg2Elev, addr)print('send msg to client:{}:{}'.format(addr, msg2Elev))time.sleep(0.5)except Exception as e:print('send_msg:{}'.format(e))# client.close()if __name__ == '__main__':es = ElevStatusWsServer('127.0.0.1', 8787).start()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。