|
|
@@ -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") |