From 5ab020f8af514ffa70d7cbe44ee74d308788cec8 Mon Sep 17 00:00:00 2001 From: Rik Veenboer Date: Sat, 12 Sep 2015 09:13:43 +0100 Subject: [PATCH] optionally start asyncore loop in thread in tcp client/server start --- datagram/UdpServer.py | 4 ++-- mysocket/TcpClient.py | 10 +++++---- mysocket/TcpServer.py | 11 +++++---- socketserver/TcpThreaded.py | 45 ------------------------------------- 4 files changed, 15 insertions(+), 55 deletions(-) delete mode 100644 socketserver/TcpThreaded.py diff --git a/datagram/UdpServer.py b/datagram/UdpServer.py index e905542..d1c974c 100644 --- a/datagram/UdpServer.py +++ b/datagram/UdpServer.py @@ -12,10 +12,10 @@ sock.bind(server_address) while True: print >>sys.stderr, '\nwaiting to receive message' data, address = sock.recvfrom(4096) - + print >>sys.stderr, 'received %s bytes from %s' % (len(data), address) print >>sys.stderr, data - + if data: sent = sock.sendto(data, address) print >>sys.stderr, 'sent %s bytes back to %s' % (sent, address) \ No newline at end of file diff --git a/mysocket/TcpClient.py b/mysocket/TcpClient.py index bc64436..1209460 100644 --- a/mysocket/TcpClient.py +++ b/mysocket/TcpClient.py @@ -28,15 +28,17 @@ class TcpClient(asyncore.dispatcher): self.send(data) self.queue = [] - def start(self): + def start(self, thread=True): self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.connect(self.address) - self.thread = threading.Thread(target=asyncore.loop, kwargs = {'timeout': 1}) - self.thread.start() + if thread: + self.thread = threading.Thread(target=asyncore.loop, kwargs = {'timeout': 1}) + self.thread.start() def stop(self): self.close() - self.thread.join() + if self.thread: + self.thread.join() def write(self, data): self.queue.append(data) diff --git a/mysocket/TcpServer.py b/mysocket/TcpServer.py index 6c5b1cb..0cb11ed 100644 --- a/mysocket/TcpServer.py +++ b/mysocket/TcpServer.py @@ -16,16 +16,19 @@ class TcpServer(asyncore.dispatcher): print 'Connected from', address self.clients.append(TcpServerClient(self, mysocket, self.bufferSize)) - def start(self): + def start(self, thread=True): self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.bind(self.address) self.listen(5) - self.thread = threading.Thread(target=asyncore.loop, kwargs = {'timeout': 0.5}) - self.thread.start() + if thread: + self.thread = threading.Thread(target=asyncore.loop, kwargs = {'timeout': 1}) + self.thread.start() def stop(self): self.close() - self.thread.join() + if self.thread: + self.thread.join() + def write(self, message): for client in self.clients: diff --git a/socketserver/TcpThreaded.py b/socketserver/TcpThreaded.py deleted file mode 100644 index 8670fa5..0000000 --- a/socketserver/TcpThreaded.py +++ /dev/null @@ -1,45 +0,0 @@ -import socket -import threading -import SocketServer - -class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): - - def handle(self): - data = self.request.recv(1024) - cur_thread = threading.current_thread() - response = "{}: {}".format(cur_thread.name, data) - self.request.sendall(response) - -class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): - pass - -def client(ip, port, message): - sock = socket.mysocket(socket.AF_INET, socket.SOCK_STREAM) - sock.connect((ip, port)) - try: - sock.sendall(message) - response = sock.recv(1024) - print "Received: {}".format(response) - finally: - sock.close() - -if __name__ == "__main__": - # Port 0 means to select an arbitrary unused port - HOST, PORT = "localhost", 0 - - server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler) - ip, port = server.server_address - - # Start a thread with the server -- that thread will then start one - # more thread for each request - server_thread = threading.Thread(target=server.serve_forever) - # Exit the server thread when the main thread terminates - server_thread.daemon = True - server_thread.start() - print "Server loop running in thread:", server_thread.name - - client(ip, port, "Hello World 1") - client(ip, port, "Hello World 2") - client(ip, port, "Hello World 3") - - server.shutdown() \ No newline at end of file