import socket
import logging
import asyncio
from SocketDTP.SDTP import SDTP
class Server(SDTP):
def __init__(self):
logging.basicConfig(level=logging.DEBUG)
self.logServer = logging.getLogger('Server')
self.loop = asyncio.get_event_loop()
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.bind(('localhost', 2324))
self.socket.listen()
super(Server, self).__init__()
self.GenPG()
def clientClose(self, client, client_address: tuple, error: str = 'No'):
self.logServer.info(f'Client close: {client_address}, Error: {error}')
client.close()
async def recvToSend(self, client, client_address: tuple, message_key: str, mac_key: str):
while True:
try:
recv = await self.encRecvAsync(self.loop, client, message_key, mac_key)
if recv:
if recv['type'] == 'message':
await self.encSendAsync(self.loop, client, message_key, mac_key, recv['data']['message'])
else:
self.clientClose(client, client_address)
break
except Exception as e:
self.clientClose(client, client_address, e.args[1])
client.close()
break
async def accept(self):
while True:
client, client_address = await self.loop.sock_accept(self.socket)
self.logServer.info(f'Client connect: {client_address}')
message_key, mac_key = self.enc_key(client, 2)
message_key, mac_key = str(message_key), str(mac_key)
self.logServer.info(f'Connections are protected')
self.loop.create_task(self.recvToSend(client, client_address, message_key, mac_key))
async def main(self):
self.logServer.info('Start Server')
await self.loop.create_task(self.accept())
def run(self):
try:
self.loop.run_until_complete(self.main())
except KeyboardInterrupt:
self.logServer.info('Close Server')
if __name__ == "__main__":
server = Server()
server.run()
import socket
import logging
import asyncio
from SocketDTP.SDTP import SDTP
class Client(SDTP):
def __init__(self):
logging.basicConfig(level=logging.INFO)
self.logClient = logging.getLogger('Client')
self.loop = asyncio.get_event_loop()
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect(('localhost', 2324))
super(Client, self).__init__()
message_key, mac_key = self.enc_key(self.socket, 2, 'client')
self.message_key, self.mac_key = str(message_key), str(mac_key)
async def recvMessage(self):
while True:
recv = await self.encRecvAsync(self.loop, self.socket, self.message_key, self.mac_key)
if recv:
if recv['type'] == 'message':
print(f"Recv server: {recv['data']['message']}")
else:
self.socket.close()
break
async def handler(self):
self.loop.create_task(self.recvMessage())
while True:
message = await self.loop.run_in_executor(None, input)
await self.encSendAsync(self.loop, self.socket, self.message_key, self.mac_key, message)
async def main(self):
await self.loop.create_task(self.handler())
def run(self):
try:
self.loop.run_until_complete(self.main())
except KeyboardInterrupt:
self.logClient.info('Close Server')
if __name__ == "__main__":
client = Client()
client.run()