客户端代码:
import socket
import threading
import time
import traceback
class ElevClient(threading.Thread):
def __init__(self, eClientId, host, port):
threading.Thread.__init__(self, name="elevClient_" + eClientId)
self.host = host
self.port = port # config.ZLAN_SERVER_PORT
self.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('-----------------------------------------')
break
except 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 json
import logging
import traceback
from threading import Thread
import socket
import threading
import time
logger = logging
class ElevStatusWsServer(Thread):
def __init__(self, host, port):
Thread.__init__(self, name="ElevStatusServer")
self.host = host
self.port = port
self.logger = logger
self.jsonTemplate = {
"Command": "FORWARD_ELEV_INFO",
"DeviceId": "C0002T",
"ElevId": 1,
}
self.seqNo = 1
self.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('-----------------------------------------------------------')
break
except 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()