diff --git a/curionet/network.py b/curionet/network.py index 279d6ea..3c74879 100644 --- a/curionet/network.py +++ b/curionet/network.py @@ -45,15 +45,15 @@ async def handle_connect(self): async def handle_connected(self): pass - async def handle_received(self, data): - pass - async def handle_send(self, data): try: await self.connection.sendall(data) except socket.error: return await self.handle_disconnect() + async def handle_received(self, data): + pass + async def handle_disconnect(self): await self.connection.close() await self.factory.remove_handler(self) @@ -155,3 +155,67 @@ def run(self): raise NetworkFactoryError('Failed to listen on socket!') return run(self.execute) + +class NetworkConnectorError(RuntimeError): + """ + A network connector specific runtime error + """ + +class NetworkConnector(object): + """ + A connector instance that manages single a socket connection + """ + + BUFFER_SIZE = 1024 + + def __init__(self, address, port): + self.address = address + self.port = port + + self.__socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + async def __update(self): + try: + data = await self.__socket.recv(self.BUFFER_SIZE) + except socket.error: + return await self.handle_disconnect() + + if not data: + return await self.handle_disconnect() + + await self.handle_received(data) + + async def handle_connected(self): + pass + + async def handle_send(self, data): + try: + await self.__socket.sendall(data) + except socket.error: + return await self.handle_disconnect() + + async def handle_received(self, data): + pass + + async def handle_disconnect(self): + await self.__socket.close() + await self.handle_disconnected() + + async def handle_disconnected(self): + pass + + async def execute(self): + await self.handle_connected() + + async with self.__socket: + while True: + await self.__update() + + def run(self): + try: + self.__socket.connect((self.address, self.port)) + except socket.error: + raise NetworkConnectorError('Failed to connect to server at (%s:%d)!' % (self.address, + self.port)) + + return run(self.execute) \ No newline at end of file diff --git a/tests/tests_tcp_client.py b/tests/tests_tcp_client.py new file mode 100644 index 0000000..6e17f1a --- /dev/null +++ b/tests/tests_tcp_client.py @@ -0,0 +1,28 @@ +""" + * Copyright (C) Caleb Marshall and others... - All Rights Reserved + * Written by Caleb Marshall , May 23rd, 2017 + * Licensing information can found in 'LICENSE', which is part of this source code package. +""" + +from curionet import network + +class ExampleConnector(network.NetworkConnector): + """ + An example connector derived from NetworkConnector + """ + + async def handle_connected(self): + print ('Connected.') + + # send the server some data... + await self.handle_send('Hello World!') + + async def handle_received(self, data): + print ('Data recieved from (%s: %r)!' % (self.address, data)) + + async def handle_disconnected(self): + print ('Disconnected.') + +if __name__ == '__main__': + connector = ExampleConnector('127.0.0.1', 8080) + connector.run() \ No newline at end of file diff --git a/tests/tests_tcp_server.py b/tests/tests_tcp_server.py index e065508..8ab5eae 100644 --- a/tests/tests_tcp_server.py +++ b/tests/tests_tcp_server.py @@ -4,22 +4,25 @@ * Licensing information can found in 'LICENSE', which is part of this source code package. """ -from curionet.network import NetworkFactory, NetworkHandler +from curionet import network -class ExampleHandler(NetworkHandler): +class ExampleHandler(network.NetworkHandler): """ An example connection handler derived from NetworkHandler """ async def handle_connected(self): - await super().handle_connected() + print ('Connected.') async def handle_received(self, data): - print ('Data recieved from %s: %r!' % (self.address, data)) + print ('Data recieved from (%s: %r)!' % (self.address, data)) - async def handle_closed(self): - await super().handle_closed() + # send the data back to the client. + await self.handle_send(data) + + async def handle_disconnected(self): + print ('Disconnected.') if __name__ == '__main__': - factory = NetworkFactory(8080, ExampleHandler) - factory.run() + factory = network.NetworkFactory('0.0.0.0', 8080, ExampleHandler) + factory.run() \ No newline at end of file