Skip to content

Commit

Permalink
curionet: added a network connector for managing single client connec…
Browse files Browse the repository at this point in the history
…tions
  • Loading branch information
cmarshall108 committed Oct 17, 2017
1 parent d169f14 commit bf0e850
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 11 deletions.
70 changes: 67 additions & 3 deletions curionet/network.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
28 changes: 28 additions & 0 deletions tests/tests_tcp_client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
"""
* Copyright (C) Caleb Marshall and others... - All Rights Reserved
* Written by Caleb Marshall <anythingtechpro@gmail.com>, 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()
19 changes: 11 additions & 8 deletions tests/tests_tcp_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()

0 comments on commit bf0e850

Please sign in to comment.