|
@@ -49,18 +49,49 @@ class Server:
|
|
|
def buffer_chunk_size(self) -> int:
|
|
|
return self._buffer_chunk_size
|
|
|
|
|
|
+ def set_reader(self, reader=None, writer=None):
|
|
|
+ self._reader = reader
|
|
|
+ _ = writer
|
|
|
+
|
|
|
+ def set_writer(self, reader=None, writer=None):
|
|
|
+ _ = reader
|
|
|
+ self._writer = writer
|
|
|
+
|
|
|
async def run_server(self):
|
|
|
logging.info("===== Started server...")
|
|
|
+ if 0: # loop.create_connection method (search about Protocol?)
|
|
|
+ reader, _ = await loop.create_connection(host=self.host, port=self.input_port)
|
|
|
+ self._reader = reader
|
|
|
+ _, writer = await loop.create_connection(host=self.host, port=self.output_port)
|
|
|
+ self._writer = writer
|
|
|
+ elif 1: # asyncio.open_connection method
|
|
|
+ reader, _ = await asyncio.open_connection(self.host, self.input_port)
|
|
|
+ self._reader = reader
|
|
|
+ _, writer = await asyncio.open_connection(self.host, self.output_port)
|
|
|
+ self._writer = writer
|
|
|
+ else: # asyncio.start_server method
|
|
|
+ await asyncio.start_server(client_connected_cb=self.set_reader, host=self.host, port=self.input_port)
|
|
|
+ await asyncio.start_server(client_connected_cb=self.set_writer, host=self.host, port=self.output_port)
|
|
|
+ while (not self.stopping) and (self.reader is None or self.writer is None):
|
|
|
+ logging.info("==... waiting for connections...==")
|
|
|
+ await asyncio.sleep(.5)
|
|
|
await asyncio.gather(
|
|
|
- self.run_reader(),
|
|
|
- self.run_writer()
|
|
|
+ self.run_writer(),
|
|
|
+ self.run_reader()
|
|
|
)
|
|
|
logging.info("... stopped server. =====")
|
|
|
return
|
|
|
|
|
|
+ async def test_client(self):
|
|
|
+ logging.info("===== Started client test...")
|
|
|
+ await asyncio.gather(
|
|
|
+ self.send('/home/davte/Provaaaaa.txt'),
|
|
|
+ self.receive('/home/davte/Ricevuto.log')
|
|
|
+ )
|
|
|
+ logging.info("... stopped client test. =====")
|
|
|
+ return
|
|
|
+
|
|
|
async def run_reader(self):
|
|
|
- reader, _ = await asyncio.open_connection(self.host, self.input_port)
|
|
|
- self._reader = reader
|
|
|
while not self.stopping:
|
|
|
try:
|
|
|
# Stop if buffer is full
|
|
@@ -76,8 +107,6 @@ class Server:
|
|
|
logging.error(e)
|
|
|
|
|
|
async def run_writer(self):
|
|
|
- _, writer = await asyncio.open_connection(self.host, self.output_port)
|
|
|
- self._writer = writer
|
|
|
while not self.stopping:
|
|
|
try:
|
|
|
# Slow down if buffer is short
|
|
@@ -88,16 +117,54 @@ class Server:
|
|
|
except IndexError:
|
|
|
continue
|
|
|
self.writer.write(input_data)
|
|
|
+ await self.writer.drain()
|
|
|
except Exception as e:
|
|
|
logging.error(e)
|
|
|
|
|
|
- def stop(self):
|
|
|
+ def stop(self, *_):
|
|
|
self._stopping = True
|
|
|
|
|
|
+ async def send(self, file_path):
|
|
|
+ await asyncio.start_server(client_connected_cb=self.set_writer, host='5.249.159.33', port='5000')
|
|
|
+ while (not self.stopping) and self.writer is None:
|
|
|
+ logging.info("==... waiting for connections...==")
|
|
|
+ await asyncio.sleep(.5)
|
|
|
+ with open(file_path, 'rb') as file_to_send:
|
|
|
+ output_data = file_to_send.read(self.buffer_chunk_size)
|
|
|
+ self.writer.write(output_data)
|
|
|
+ await self.writer.drain()
|
|
|
+
|
|
|
+ async def receive(self, file_path):
|
|
|
+ await asyncio.start_server(client_connected_cb=self.set_reader, host='5.249.159.33', port='5001')
|
|
|
+ while (not self.stopping) and self.reader is None:
|
|
|
+ logging.info("==... waiting for connections...==")
|
|
|
+ await asyncio.sleep(.5)
|
|
|
+ with open(file_path, 'wb') as file_to_receive:
|
|
|
+ try:
|
|
|
+ input_data = await self.reader.readexactly(self.buffer_chunk_size)
|
|
|
+ except asyncio.IncompleteReadError as e:
|
|
|
+ input_data = e.partial
|
|
|
+ file_to_receive.write(input_data)
|
|
|
+
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
+ log_formatter = logging.Formatter(
|
|
|
+ "%(asctime)s [%(module)-15s %(levelname)-8s] %(message)s",
|
|
|
+ style='%'
|
|
|
+ )
|
|
|
+ root_logger = logging.getLogger()
|
|
|
+ root_logger.setLevel(logging.DEBUG)
|
|
|
+
|
|
|
+ console_handler = logging.StreamHandler()
|
|
|
+ console_handler.setFormatter(log_formatter)
|
|
|
+ console_handler.setLevel(logging.DEBUG)
|
|
|
+ root_logger.addHandler(console_handler)
|
|
|
+
|
|
|
loop = asyncio.get_event_loop()
|
|
|
- server = Server()
|
|
|
+ server = Server(
|
|
|
+ input_port=5000,
|
|
|
+ output_port=5001
|
|
|
+ )
|
|
|
loop.add_signal_handler(signal.SIGINT, server.stop, loop)
|
|
|
logging.info("Starting file bridging server...")
|
|
|
loop.run_until_complete(server.run_server())
|