def _send(self, msg_bytes): """ Send bytes to server """ log.d("Sending", sys.getsizeof(msg_bytes), "bytes to server", self._server) try: self._sock.sendall(msg_bytes) except (ConnectionResetError, ConnectionAbortedError): try: self.connect(self._last_user, self._last_pass) self._sock.sendall(msg_bytes) except socket.error: self._alive = False raise exceptions.ServerDisconnectError( self.name, "Server is not connected") self._sock.sendall(constants.postfix)
def communicate(self, msg): """Send and receive data with server params: msg -- Message object returns: json from server """ assert isinstance(msg, message.CoreMessage) # log send if self._alive: self._sock.sendall(msg.serialize(self.name)) self._sock.sendall(constants.postfix) return self._recv() else: raise exceptions.ServerDisconnectError( self.name, "Server already disconnected")
def _recv(self): "returns json" # log receive try: buffer = b'' while not buffer.endswith(constants.postfix): # loose data = self._sock.recv(constants.data_size) if not data: self._alive = False raise exceptions.ServerDisconnectError( self.name, "Server disconnected") buffer += data # log received return utils.convert_to_json(buffer, self.name) except socket.error as e: # log disconnect self.alive = False raise exceptions.ServerError(self.name, "{}".format(e))
def connect(self): "Connect to the server" if not self._alive: try: log.i("Client connecting to server at: {}".format( self._server)) try: self._sock.connect(self._server) except (OSError, ConnectionError) as e: if e.errno == errno.EISCONN and self.session: # already connected self._alive = True return else: raise self._alive = True self._server_info(self._recv()) if self.session: self._accepted = True except (OSError, ConnectionError) as e: self._disconnect() raise exceptions.ServerDisconnectError(self.name, "{}".format(e))
def _recv(self): "returns json" try: buffered = None eof = False while not eof: temp = self._sock.recv(constants.data_size) if not temp: self._disconnect() raise exceptions.ServerDisconnectError( self.name, "Server disconnected") self._buffer += temp data, eof = utils.end_of_message(self._buffer) if eof: buffered = data[0] self._buffer = data[1] log.d("Received", sys.getsizeof(buffered), "bytes from server", self._server) buffered = gzip.decompress(buffered) return utils.convert_to_json(buffered, self.name, log=log) except (socket.error, ConnectionError) as e: self._disconnect() raise exceptions.ConnectionError(self.name, "{}".format(e))