From 8d1589fb47e9b3b58ea5e4f2e3b4de51a7780297 Mon Sep 17 00:00:00 2001 From: Artem30801 Date: Mon, 8 Apr 2019 20:28:24 +0300 Subject: [PATCH] First working client --- Drone/client.py | 47 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/Drone/client.py b/Drone/client.py index f0f8412..0011241 100644 --- a/Drone/client.py +++ b/Drone/client.py @@ -4,6 +4,7 @@ import random import socket import struct import logging +import selectors2 as selectors import ConfigParser from contextlib import closing @@ -22,6 +23,7 @@ logging.basicConfig( # TODO all prints as logs class Client: def __init__(self, config_path="client_config.ini"): + self.selector = selectors.DefaultSelector() self.client_socket = None self.server_host = None self.server_port = None @@ -81,7 +83,6 @@ class Client: unpacked = struct.unpack(NTP_PACKET_FORMAT, msg[0:struct.calcsize(NTP_PACKET_FORMAT)]) return unpacked[10] + float(unpacked[11]) / 2 ** 32 - NTP_DELTA - def reconnect(self, timeout=2, attempt_limit=5): logging.info("Trying to connect to {}:{} ...".format(self.server_host, self.server_port)) attempt_count = 0 @@ -103,6 +104,8 @@ class Client: self.connected = True #self.client_socket.settimeout(None) self.client_socket.setblocking(False) + events = selectors.EVENT_READ | selectors.EVENT_WRITE + self.selector.register(self.client_socket, events, data=None) logging.info("Connection to server successful!") break @@ -111,7 +114,6 @@ class Client: self.broadcast_bind() attempt_count = 0 - def broadcast_bind(self): broadcast_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) broadcast_client.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) @@ -135,17 +137,38 @@ class Client: finally: broadcast_client.close() + def service_connection(self, key, mask): + sock = key.fileobj + data = key.data + if mask & selectors.EVENT_READ: + recv_data = sock.recv(1024) # Should be ready to read + if recv_data: + print("received", repr(recv_data), "from connection", ) + if not recv_data: + print("closing connection",) + self.selector.unregister(sock) + self.client_socket.close() + if mask & selectors.EVENT_READ: + pass + + def mainloop(self): - while True: - #''' - message = Message() - print("Recieving message:") - while not message.content: - message.income_raw += self.client_socket.recv(1) - print(message.income_raw) - message.process_message() - print(message.content) - # ''' + #self.client_socket.send("104771313759739") + try: + while True: + events = self.selector.select(timeout=1) + if events: + for key, mask in events: + self.service_connection(key, mask) + pass + + if not self.selector.get_map(): + logging.warning("No active connections left") + self.reconnect() + except KeyboardInterrupt: + print("caught keyboard interrupt, exiting") + finally: + self.selector.close() if __name__ == "__main__":