fix server/client connection

This commit is contained in:
Bastian Schroll 2019-10-23 19:05:09 +02:00
parent 549fbafc29
commit 464c0c2298
No known key found for this signature in database
GPG key ID: 0AE96912A20E9F5F
2 changed files with 15 additions and 6 deletions

View file

@ -110,9 +110,14 @@ class TCPClient:
if self._sock:
_, write, _ = select.select([], [self._sock], [], 0.1)
if write:
self._sock.send(bytes("", "utf-8"))
data = "<keep-alive>"
header = str(len(data)).ljust(HEADERSIZE)
self._sock.sendall(bytes(header + data, "utf-8"))
return True
return False
except:
logging.exception("cannot check connection status")
except socket.error as e:
if e.errno != 32:
logging.exception(e)
return False
except ValueError:
return False

View file

@ -51,10 +51,13 @@ class _ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
if not len(header):
break # empty data -> socked closed
logging.debug("%s recv header: '%s'", req_name, header)
length = int(header.decode("utf-8").strip())
data = self.request.recv(length).decode("utf-8")
if data == "<keep-alive>":
continue
logging.debug("%s recv header: '%s'", req_name, header)
logging.debug("%s recv %d bytes:\n%s", req_name, length, pformat(data))
# add a new entry and the decoded data dict as an string in utf-8 and an timestamp
@ -66,12 +69,12 @@ class _ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
data = "[ack]"
header = str(len(data)).ljust(HEADERSIZE)
self.request.sendall(bytes(header + data, "utf-8"))
self.request.close()
except socket.error as e:
logging.error(e)
return False
finally:
self.request.close()
del self.server.clientsConnected[threading.current_thread().name]
logging.info("Client disconnected: %s", self.client_address[0])
@ -114,7 +117,7 @@ class TCPServer:
@return True or False"""
if not self.isRunning:
try:
socketserver.TCPServer.allow_reuse_address = False # because we can start two instances on same port elsewhere
socketserver.TCPServer.allow_reuse_address = True # because we can start two instances on same port elsewhere
self._server = _ThreadedTCPServer(("", port), _ThreadedTCPRequestHandler)
self._server.timeout = self._timeout
self._server.alarmQueue = self._alarmQueue
@ -143,6 +146,7 @@ class TCPServer:
if self.isRunning:
self._server.shutdown()
self._server.isActive = False
self._server.server_close()
self._server_thread.join()
self._server_thread = None
self._server = None