From 568d49d644d831ffadfb750105a51b447a759e67 Mon Sep 17 00:00:00 2001 From: inpos Date: Mon, 30 May 2016 14:17:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handlers/__init__.py | 0 handlers/smtp.py | 29 +++++++++++++++++++ main.py | 69 ++++++++++++++++++++++++-------------------- mechs/__init__.py | 0 4 files changed, 67 insertions(+), 31 deletions(-) create mode 100644 handlers/__init__.py create mode 100644 handlers/smtp.py create mode 100644 mechs/__init__.py diff --git a/handlers/__init__.py b/handlers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/handlers/smtp.py b/handlers/smtp.py new file mode 100644 index 0000000..bf96b18 --- /dev/null +++ b/handlers/smtp.py @@ -0,0 +1,29 @@ +from socketserver import StreamRequestHandler + +ERR_CODE = { + 220 : '' + 500 : 'Syntax error, command unrecognized', + } + +class SmtpProcessor(object): + def __init__(self, src_addr, rfile,wfile): + self.src_addr = src_addr + self.rfile = rfile + self.wfile = wfile + self.unrec_commands_count = 0 + +class SmtpHandler(StreamRequestHandler): + + def handle(self): + # self.rfile is a file-like object created by the handler; + # we can now use e.g. readline() instead of raw recv() calls + self.data = self.rfile.readline().strip() + print("{} wrote:".format(self.client_address[0])) + print(self.data) + # Likewise, self.wfile is a file-like object used to write back + # to the client + self.wfile.write(self.data.upper()) + + ####################################################### + processor = SmtpProcessor(self.client_address, self.rfile, self.wfile) + \ No newline at end of file diff --git a/main.py b/main.py index e81f4b3..a258162 100644 --- a/main.py +++ b/main.py @@ -1,31 +1,38 @@ -import asyncio - -clients = {} # task -> (reader, writer) - -def client_connected_handler(client_reader, client_writer): - # Start a new asyncio.Task to handle this specific client connection - task = asyncio.Task(handle_client(client_reader, client_writer)) - clients[task] = (client_reader, client_writer) - - def client_done(task): - # When the tasks that handles the specific client connection is done - del clients[task] - - # Add the client_done callback to be run when the future becomes done - task.add_done_callback(client_done) - -@asyncio.coroutine -def handle_client(client_reader, client_writer): - # Handle the requests for a specific client with a line oriented protocol - while True: - # Read a line - data = (yield from client_reader.readline()) - # Send it back to the client - client_writer.write(data) - -loop = asyncio.get_event_loop() -server = loop.run_until_complete(asyncio.start_server(client_connected_handler, 'localhost', 2222)) -try: - loop.run_forever() -finally: - loop.close() \ No newline at end of file +import socketserver, subprocess, sys +from threading import Thread +from pprint import pprint +import json + +my_unix_command = ['bc'] +HOST = 'localhost' +PORT = 2000 + +class SingleTCPHandler(socketserver.StreamRequestHandler): + + def handle(self): + # self.rfile is a file-like object created by the handler; + # we can now use e.g. readline() instead of raw recv() calls + self.data = self.rfile.readline().strip() + print("{} wrote:".format(self.client_address[0])) + print(self.data) + # Likewise, self.wfile is a file-like object used to write back + # to the client + self.wfile.write(self.data.upper()) + + +class SimpleServer(socketserver.ThreadingMixIn, socketserver.TCPServer): + # Ctrl-C will cleanly kill all spawned threads + daemon_threads = True + # much faster rebinding + allow_reuse_address = True + + def __init__(self, server_address, RequestHandlerClass): + socketserver.TCPServer.__init__(self, server_address, RequestHandlerClass) + +if __name__ == "__main__": + server = SimpleServer((HOST, PORT), SingleTCPHandler) + # terminate with Ctrl-C + try: + server.serve_forever() + except KeyboardInterrupt: + sys.exit(0) \ No newline at end of file diff --git a/mechs/__init__.py b/mechs/__init__.py new file mode 100644 index 0000000..e69de29