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

View File

@@ -6,14 +6,15 @@ import time
class TcpServer(asyncore.dispatcher):
clients = []
def __init__(self, host, port):
def __init__(self, host, port, bufferSize = 1000):
asyncore.dispatcher.__init__(self)
self.address = (host, port)
self.bufferSize = bufferSize
def handle_accept(self):
mysocket, address = self.accept()
print 'Connected from', address
self.clients.append(TcpServerClient(self, mysocket))
self.clients.append(TcpServerClient(self, mysocket, self.bufferSize))
def start(self):
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
@@ -26,27 +27,30 @@ class TcpServer(asyncore.dispatcher):
self.close()
self.thread.join()
def send(self, message):
def write(self, message):
for client in self.clients:
client._send(message)
client.write(message)
def input(self, client, data):
print 'input from ', client.getpeername(), ': ', data
pass
class TcpServerClient(asyncore.dispatcher_with_send):
queue = []
def __init__(self, server, mysocket):
asyncore.dispatcher_with_send.__init__(self, mysocket)
def __init__(self, server, socket, bufferSize = 1000):
asyncore.dispatcher_with_send.__init__(self, socket)
self.server = server
self.bufferSize = bufferSize
def handle_read(self):
data = self.recv(8192)
data = self.recv(self.bufferSize)
if data:
self.server.input(self, data)
def handle_close(self):
print 'Disconnected from', self.getpeername()
self.close()
self.server.clients.remove(self)
def handle_write(self):
for data in self.queue:
@@ -56,15 +60,19 @@ class TcpServerClient(asyncore.dispatcher_with_send):
def writable(self):
return len(self.queue) > 0
def _send(self, data):
def write(self, data):
self.queue.append(data)
def server_input(client, data):
print 'server:', data
if __name__ == '__main__':
server = TcpServer('', 10000)
server.input = server_input
server.start()
for i in range(1, 50):
server.send('server #%d' % i)
for i in range(1, 5000):
server.write('server #%d' % i)
time.sleep(1)
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):
for i in range(1, 50):
self.server.send('server #%d' % i)
self.server.write('server #%d' % i)
time.sleep(1)
for i in range(1, 50):
self.client.send('client #%d' % i)
self.client.write('client #%d' % i)
time.sleep(1)
if __name__ == '__main__':