Начальный комит
parent
7de6ed476a
commit
568d49d644
|
@ -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)
|
||||||
|
|
57
main.py
57
main.py
|
@ -1,31 +1,38 @@
|
||||||
import asyncio
|
import socketserver, subprocess, sys
|
||||||
|
from threading import Thread
|
||||||
|
from pprint import pprint
|
||||||
|
import json
|
||||||
|
|
||||||
clients = {} # task -> (reader, writer)
|
my_unix_command = ['bc']
|
||||||
|
HOST = 'localhost'
|
||||||
|
PORT = 2000
|
||||||
|
|
||||||
def client_connected_handler(client_reader, client_writer):
|
class SingleTCPHandler(socketserver.StreamRequestHandler):
|
||||||
# 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):
|
def handle(self):
|
||||||
# When the tasks that handles the specific client connection is done
|
# self.rfile is a file-like object created by the handler;
|
||||||
del clients[task]
|
# 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())
|
||||||
|
|
||||||
# Add the client_done callback to be run when the future becomes done
|
|
||||||
task.add_done_callback(client_done)
|
|
||||||
|
|
||||||
@asyncio.coroutine
|
class SimpleServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
|
||||||
def handle_client(client_reader, client_writer):
|
# Ctrl-C will cleanly kill all spawned threads
|
||||||
# Handle the requests for a specific client with a line oriented protocol
|
daemon_threads = True
|
||||||
while True:
|
# much faster rebinding
|
||||||
# Read a line
|
allow_reuse_address = True
|
||||||
data = (yield from client_reader.readline())
|
|
||||||
# Send it back to the client
|
|
||||||
client_writer.write(data)
|
|
||||||
|
|
||||||
loop = asyncio.get_event_loop()
|
def __init__(self, server_address, RequestHandlerClass):
|
||||||
server = loop.run_until_complete(asyncio.start_server(client_connected_handler, 'localhost', 2222))
|
socketserver.TCPServer.__init__(self, server_address, RequestHandlerClass)
|
||||||
try:
|
|
||||||
loop.run_forever()
|
if __name__ == "__main__":
|
||||||
finally:
|
server = SimpleServer((HOST, PORT), SingleTCPHandler)
|
||||||
loop.close()
|
# terminate with Ctrl-C
|
||||||
|
try:
|
||||||
|
server.serve_forever()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
sys.exit(0)
|
Loading…
Reference in New Issue