|
@@ -113,23 +113,27 @@ class Server:
|
|
"""
|
|
"""
|
|
client_hello = await reader.readline()
|
|
client_hello = await reader.readline()
|
|
client_hello = client_hello.decode('utf-8').strip('\n').split('|')
|
|
client_hello = client_hello.decode('utf-8').strip('\n').split('|')
|
|
- peer_is_sender = client_hello[0] == 's'
|
|
|
|
|
|
+ if len(client_hello) not in (2, 4,):
|
|
|
|
+ await self.refuse_connection(writer=writer,
|
|
|
|
+ message="Invalid client_hello!")
|
|
|
|
+ return
|
|
connection_token = client_hello[1]
|
|
connection_token = client_hello[1]
|
|
if connection_token not in self.connections:
|
|
if connection_token not in self.connections:
|
|
self.connections[connection_token] = dict(
|
|
self.connections[connection_token] = dict(
|
|
sender=False,
|
|
sender=False,
|
|
receiver=False
|
|
receiver=False
|
|
)
|
|
)
|
|
- if peer_is_sender:
|
|
|
|
|
|
+ if client_hello[0] == 's':
|
|
if self.connections[connection_token]['sender']:
|
|
if self.connections[connection_token]['sender']:
|
|
- writer.write(
|
|
|
|
- "Invalid token! "
|
|
|
|
- "A sender client is already connected!\n".encode('utf-8')
|
|
|
|
|
|
+ await self.refuse_connection(
|
|
|
|
+ writer=writer,
|
|
|
|
+ message="Invalid token! "
|
|
|
|
+ "A sender client is already connected!\n"
|
|
)
|
|
)
|
|
- await writer.drain()
|
|
|
|
- writer.close()
|
|
|
|
return
|
|
return
|
|
self.connections[connection_token]['sender'] = True
|
|
self.connections[connection_token]['sender'] = True
|
|
|
|
+ self.connections[connection_token]['file_name'] = client_hello[2]
|
|
|
|
+ self.connections[connection_token]['file_size'] = client_hello[3]
|
|
self.buffers[connection_token] = collections.deque()
|
|
self.buffers[connection_token] = collections.deque()
|
|
logging.info("Sender is connecting...")
|
|
logging.info("Sender is connecting...")
|
|
index, step = 0, 1
|
|
index, step = 0, 1
|
|
@@ -148,14 +152,13 @@ class Server:
|
|
await self.run_reader(reader=reader,
|
|
await self.run_reader(reader=reader,
|
|
connection_token=connection_token)
|
|
connection_token=connection_token)
|
|
logging.info("Incoming transmission ended")
|
|
logging.info("Incoming transmission ended")
|
|
- else:
|
|
|
|
|
|
+ else: # Receiver client connection
|
|
if self.connections[connection_token]['receiver']:
|
|
if self.connections[connection_token]['receiver']:
|
|
- writer.write(
|
|
|
|
- "Invalid token! "
|
|
|
|
- "A receiver client is already connected!\n".encode('utf-8')
|
|
|
|
|
|
+ await self.refuse_connection(
|
|
|
|
+ writer=writer,
|
|
|
|
+ message="Invalid token! "
|
|
|
|
+ "A receiver client is already connected!\n"
|
|
)
|
|
)
|
|
- await writer.drain()
|
|
|
|
- writer.close()
|
|
|
|
return
|
|
return
|
|
self.connections[connection_token]['receiver'] = True
|
|
self.connections[connection_token]['receiver'] = True
|
|
logging.info("Receiver is connecting...")
|
|
logging.info("Receiver is connecting...")
|
|
@@ -168,7 +171,13 @@ class Server:
|
|
step += 1
|
|
step += 1
|
|
index = 0
|
|
index = 0
|
|
await asyncio.sleep(.5)
|
|
await asyncio.sleep(.5)
|
|
- # Send start signal to client
|
|
|
|
|
|
+ # Send file information and start signal to client
|
|
|
|
+ writer.write(
|
|
|
|
+ "info|"
|
|
|
|
+ f"{self.connections[connection_token]['file_name']}|"
|
|
|
|
+ f"{self.connections[connection_token]['file_size']}"
|
|
|
|
+ "\n".encode('utf-8')
|
|
|
|
+ )
|
|
writer.write("start!\n".encode('utf-8'))
|
|
writer.write("start!\n".encode('utf-8'))
|
|
await writer.drain()
|
|
await writer.drain()
|
|
await self.run_writer(writer=writer,
|
|
await self.run_writer(writer=writer,
|
|
@@ -176,7 +185,6 @@ class Server:
|
|
logging.info("Outgoing transmission ended")
|
|
logging.info("Outgoing transmission ended")
|
|
del self.buffers[connection_token]
|
|
del self.buffers[connection_token]
|
|
del self.connections[connection_token]
|
|
del self.connections[connection_token]
|
|
- return
|
|
|
|
|
|
|
|
def run(self):
|
|
def run(self):
|
|
loop = asyncio.get_event_loop()
|
|
loop = asyncio.get_event_loop()
|
|
@@ -203,7 +211,18 @@ class Server:
|
|
)
|
|
)
|
|
async with self.server:
|
|
async with self.server:
|
|
await self.server.serve_forever()
|
|
await self.server.serve_forever()
|
|
- return
|
|
|
|
|
|
+
|
|
|
|
+ @staticmethod
|
|
|
|
+ async def refuse_connection(writer: asyncio.StreamWriter,
|
|
|
|
+ message: str = None):
|
|
|
|
+ """Send a `message` via writer and close it."""
|
|
|
|
+ if message is None:
|
|
|
|
+ message = "Connection refused!\n"
|
|
|
|
+ writer.write(
|
|
|
|
+ message.encode('utf-8')
|
|
|
|
+ )
|
|
|
|
+ await writer.drain()
|
|
|
|
+ writer.close()
|
|
|
|
|
|
|
|
|
|
def main():
|
|
def main():
|