客户端代码:

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()