def _send_command(self, s: ClientObjectSocket): s.send_object( Message( self.id, self.current_server_id, -1, ClientRequest(self.id, self.current_cmd), ))
def test_send_object_across(): port = random.randint(20000, 30000) server = ClientObjectSocket.get_cosserver(port) client = ClientObjectSocket.get_cosclient(port) client.send_object("hello") client.send_object("hello2") (sclient, _) = server.accept() assert sclient.recv_object() == "hello" assert sclient.recv_object() == "hello2"
def __init__(self, port, id, answers, sleeps): self.id = id self.socket = ClientObjectSocket.get_cosserver(port) self.running = True self.answers = answers self.sleeps = sleeps self.answer_idx = 0
def startReceiving(self): """Start the server socket and listening on it. On every incoming connection, retrieve all objects from the connection. These objects are put in the recvQueue. """ self.logger.info(f"Start receiving on {self.id}") server = ClientObjectSocket.get_cosserver(self.config[self.id]["port"]) def listen_on_connection(s): # if the listensocket closes or has error, just drop it try: while self._isRunning("listen_on_connection"): try: received_object = s.recv_object() # store socket to client to be able to reply if isinstance(received_object.payload, ClientRequest): self.clientsockets[received_object.sender_id] = s self.recvQueue.put(received_object, block=False) except socket.timeout: continue # expected timeout; needed to check if recvRunning is still true except queue.Full: self.logger.debug( f"RaftServer({self.id}): recvQueue is full dropping message {received_object}." ) self.logger.debug( f"Server {self.id} received object {received_object}") except COSConnectionClosed as e: s.close() self.logger.debug("listening socket closed") except Exception as e: self.logger.debug( f"Server {self.id}: Unexpected exception in listedn_on_connection_fn: {e}." ) raise def listen_for_connections(): while self._isRunning("listen_for_connections"): try: (client, addr) = server.accept() self.logger.debug("Connection from %s", addr) threading.Thread( target=listen_on_connection, args=(client, ), name=f"RaftServer({self.id}): listen_on_connection", ).start() except socket.timeout: continue # expected timeout; needed to check if sendRunning is still true except: self.logger.debug( "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ) self.listening_thread = threading.Thread( target=listen_for_connections, name=f"RaftServer({self.id}): listen_for_connections.", ) self.listening_thread.start() self.logger.info("Started server thread for server %d", self.id)
def client(config, message, to_server): with open(config) as f: config = YAML().load(f) if not to_server in config.keys(): print("You are trying to send to a server that does not exit.") sys.exit(1) socket = ClientObjectSocket.get_cosclient(config[to_server]["port"]) socket.send_object(Message(message, 666, to_server))
def test_to_and_from_bytes(): x = 9 assert x == ClientObjectSocket.object_from_bytes( ClientObjectSocket.object_to_bytes(x) ) h = Hello("howdy") h_new = ClientObjectSocket.object_from_bytes(ClientObjectSocket.object_to_bytes(h)) assert h == h_new with pytest.raises(COSocketDecodeError): ClientObjectSocket.object_from_bytes(ClientObjectSocket.object_to_bytes(h)[:30])
def test_send_object(): mocksock = Mock() bs = ClientObjectSocket.object_to_bytes(Hello("howdy")) mocksock.send.side_effect = [len(bs)] cos = ClientObjectSocket(mocksock) cos.send_object(Hello("howdy")) assert mocksock.send.call_count == 1 assert mocksock.send.call_args == call(bs) mocksock.send.reset_mock() mocksock.send.side_effect = [25, len(bs) - 25] cos.send_object(Hello("howdy")) assert mocksock.send.call_count == 2 assert mocksock.send.call_args_list == [call(bs), call(bs[25:])]
def test_recv_object(): mocksock = Mock() bs = ClientObjectSocket.object_to_bytes(Hello("howdy")) # receive object once in one chunk mocksock.recv.side_effect = [bs] cos = ClientObjectSocket(mocksock) o = cos.recv_object() assert Hello("howdy") == o # receive object twice in bits mocksock.recv.side_effect = [bs[:10], bs[10:] + bs[:25], bs[25:]] o = cos.recv_object() assert Hello("howdy") == o o = cos.recv_object() assert Hello("howdy") == o
def sendfn(): while self._isRunning("sendfn"): try: message = self.sendQueue.get(timeout=1) self.logger.debug( "Server %d send %s to %d", message.sender_id, repr(message), message.recver_id, ) # only open sockets for other servers not for clients if (self.clientsockets.get(message.recver_id) is None and message.recver_id in self.config.keys()): self.clientsockets[ message. recver_id] = ClientObjectSocket.get_cosclient( self.config[message.recver_id]["port"]) self.clientsockets[message.recver_id].send_object(message) except BrokenPipeError as e: self.logger.debug( f"Dropping message {message} to {message.recver_id}; connection was closed: {e}." ) self.clientsockets[dest].close() del self.clientsockets[dest] except ConnectionRefusedError as e: self.logger.debug( f"Dropping message {message} to {message.recver_id}; connection was refused: {e}." ) except queue.Empty: continue # expected empty; keep checking the queue except socket.timeout: continue # expected timeout; needed to check if sendRunning is still true except: self.logger.debug( "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" )
def _get_socket(self): return ClientObjectSocket.get_cosclient( self.cluster_config[self.current_server_id]["port"])