package tcp socket implementation for more flexible use

This commit is contained in:
2015-09-07 22:33:50 +01:00
parent ba882d7e2b
commit aee68f8c7c
4 changed files with 43 additions and 26 deletions

View File

@@ -6,19 +6,19 @@ import time
class TcpClient(asyncore.dispatcher): class TcpClient(asyncore.dispatcher):
queue = [] queue = []
def __init__(self, host, port): def __init__(self, host, port, bufferSize = 1000):
asyncore.dispatcher.__init__(self) asyncore.dispatcher.__init__(self)
self.address = (host, port) self.address = (host, port)
self.bufferSize = bufferSize
def handle_connect(self): def handle_connect(self):
print "Connected to server" print "Connected to server"
def handle_close(self): def handle_close(self):
self.close() self.close()
def handle_read(self): def handle_read(self):
response = self.recv(8192) self.input(self.recv(self.bufferSize))
print "Received:", response
def writable(self): def writable(self):
return (len(self.queue) > 0) return (len(self.queue) > 0)
@@ -38,15 +38,22 @@ class TcpClient(asyncore.dispatcher):
self.close() self.close()
self.thread.join() self.thread.join()
def _send(self, data): def write(self, data):
self.queue.append(data) self.queue.append(data)
def input(self, data):
pass
def client_input(data):
print 'client:', data
if __name__ == '__main__': if __name__ == '__main__':
client = TcpClient('localhost', 10000) client = TcpClient('localhost', 10000)
client.input = client_input
client.start() client.start()
for i in range(1, 50): for i in range(1, 5000):
client.send('client #%d' % i) client.write('client #%d' % i)
time.sleep(1) time.sleep(1)
client.stop() client.stop()

View File

@@ -6,14 +6,15 @@ import time
class TcpServer(asyncore.dispatcher): class TcpServer(asyncore.dispatcher):
clients = [] clients = []
def __init__(self, host, port): def __init__(self, host, port, bufferSize = 1000):
asyncore.dispatcher.__init__(self) asyncore.dispatcher.__init__(self)
self.address = (host, port) self.address = (host, port)
self.bufferSize = bufferSize
def handle_accept(self): def handle_accept(self):
mysocket, address = self.accept() mysocket, address = self.accept()
print 'Connected from', address print 'Connected from', address
self.clients.append(TcpServerClient(self, mysocket)) self.clients.append(TcpServerClient(self, mysocket, self.bufferSize))
def start(self): def start(self):
self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
@@ -21,32 +22,35 @@ class TcpServer(asyncore.dispatcher):
self.listen(5) self.listen(5)
self.thread = threading.Thread(target=asyncore.loop, kwargs = {'timeout': 0.5}) self.thread = threading.Thread(target=asyncore.loop, kwargs = {'timeout': 0.5})
self.thread.start() self.thread.start()
def stop(self): def stop(self):
self.close() self.close()
self.thread.join() self.thread.join()
def send(self, message): def write(self, message):
for client in self.clients: for client in self.clients:
client._send(message) client.write(message)
def input(self, client, data): def input(self, client, data):
print 'input from ', client.getpeername(), ': ', data pass
class TcpServerClient(asyncore.dispatcher_with_send): class TcpServerClient(asyncore.dispatcher_with_send):
queue = [] queue = []
def __init__(self, server, mysocket): def __init__(self, server, socket, bufferSize = 1000):
asyncore.dispatcher_with_send.__init__(self, mysocket) asyncore.dispatcher_with_send.__init__(self, socket)
self.server = server self.server = server
self.bufferSize = bufferSize
def handle_read(self): def handle_read(self):
data = self.recv(8192) data = self.recv(self.bufferSize)
if data: if data:
self.server.input(self, data) self.server.input(self, data)
def handle_close(self): def handle_close(self):
print 'Disconnected from', self.getpeername() print 'Disconnected from', self.getpeername()
self.close()
self.server.clients.remove(self)
def handle_write(self): def handle_write(self):
for data in self.queue: for data in self.queue:
@@ -56,15 +60,19 @@ class TcpServerClient(asyncore.dispatcher_with_send):
def writable(self): def writable(self):
return len(self.queue) > 0 return len(self.queue) > 0
def _send(self, data): def write(self, data):
self.queue.append(data) self.queue.append(data)
def server_input(client, data):
print 'server:', data
if __name__ == '__main__': if __name__ == '__main__':
server = TcpServer('', 10000) server = TcpServer('', 10000)
server.input = server_input
server.start() server.start()
for i in range(1, 50): for i in range(1, 5000):
server.send('server #%d' % i) server.write('server #%d' % i)
time.sleep(1) time.sleep(1)
server.stop() server.stop()

View File

@@ -0,0 +1,2 @@
from .TcpClient import TcpClient
from .TcpServer import TcpServer

View File

@@ -17,11 +17,11 @@ class TestTcpCommunication(unittest.TestCase):
def test_tcp_communication(self): def test_tcp_communication(self):
for i in range(1, 50): for i in range(1, 50):
self.server.send('server #%d' % i) self.server.write('server #%d' % i)
time.sleep(1) time.sleep(1)
for i in range(1, 50): for i in range(1, 50):
self.client.send('client #%d' % i) self.client.write('client #%d' % i)
time.sleep(1) time.sleep(1)
if __name__ == '__main__': if __name__ == '__main__':