|  |  | @@ -0,0 +1,60 @@ | 
    
    |  |  | import multiprocessing | 
    
    |  |  | import socket | 
    
    |  |  | 
 | 
    
    |  |  | def handle(connection, address): | 
    
    |  |  | import logging | 
    
    |  |  | logging.basicConfig(level=logging.DEBUG) | 
    
    |  |  | logger = logging.getLogger("process-%r" % (address,)) | 
    
    |  |  | try: | 
    
    |  |  | logger.debug("Connected %r at %r", connection, address) | 
    
    |  |  | while True: | 
    
    |  |  | data = connection.recv(1024) | 
    
    |  |  | if data == "": | 
    
    |  |  | logger.debug("Socket closed remotely") | 
    
    |  |  | break | 
    
    |  |  | logger.debug("Received data %r", data) | 
    
    |  |  | connection.sendall(data) | 
    
    |  |  | logger.debug("Sent data") | 
    
    |  |  | except: | 
    
    |  |  | logger.exception("Problem handling request") | 
    
    |  |  | finally: | 
    
    |  |  | logger.debug("Closing socket") | 
    
    |  |  | connection.close() | 
    
    |  |  | 
 | 
    
    |  |  | class Server(object): | 
    
    |  |  | def __init__(self, hostname, port): | 
    
    |  |  | import logging | 
    
    |  |  | self.logger = logging.getLogger("server") | 
    
    |  |  | self.hostname = hostname | 
    
    |  |  | self.port = port | 
    
    |  |  | 
 | 
    
    |  |  | def start(self): | 
    
    |  |  | self.logger.debug("listening") | 
    
    |  |  | self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | 
    
    |  |  | self.socket.bind((self.hostname, self.port)) | 
    
    |  |  | self.socket.listen(1) | 
    
    |  |  | 
 | 
    
    |  |  | while True: | 
    
    |  |  | conn, address = self.socket.accept() | 
    
    |  |  | self.logger.debug("Got connection") | 
    
    |  |  | process = multiprocessing.Process(target=handle, args=(conn, address)) | 
    
    |  |  | process.daemon = True | 
    
    |  |  | process.start() | 
    
    |  |  | self.logger.debug("Started process %r", process) | 
    
    |  |  | 
 | 
    
    |  |  | if __name__ == "__main__": | 
    
    |  |  | import logging | 
    
    |  |  | logging.basicConfig(level=logging.DEBUG) | 
    
    |  |  | server = Server("0.0.0.0", 9000) | 
    
    |  |  | try: | 
    
    |  |  | logging.info("Listening") | 
    
    |  |  | server.start() | 
    
    |  |  | except: | 
    
    |  |  | logging.exception("Unexpected exception") | 
    
    |  |  | finally: | 
    
    |  |  | logging.info("Shutting down") | 
    
    |  |  | for process in multiprocessing.active_children(): | 
    
    |  |  | logging.info("Shutting down process %r", process) | 
    
    |  |  | process.terminate() | 
    
    |  |  | process.join() | 
    
    |  |  | logging.info("All done") |