/ baseserver.py
baseserver.py
1 from argparse import ArgumentParser 2 from socket import * 3 from traceback import format_exc 4 5 6 class BaseHandler: 7 def handle(self, c): 8 print(c) 9 10 11 class BaseServer: 12 def __init__(self, bind, handler): 13 self.bind = bind 14 self.handler = handler 15 16 def start(self): 17 pass 18 19 20 class TCPServer(BaseServer): 21 def __init__(self, bind, handler): 22 super().__init__(bind, handler) 23 self.s = socket(AF_INET, SOCK_STREAM) 24 self.s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 25 self.s.bind(bind) 26 self.s.listen(1) 27 28 def start(self): 29 try: 30 while True: 31 c, caddr = self.s.accept() 32 c.settimeout(10) 33 print("Connected:", caddr) 34 35 try: 36 self.handler.handle(c) 37 except TimeoutError: 38 print("Timeout") 39 pass 40 except Exception as e: 41 print("\x1b[31m" + format_exc() + "\x1b[m") 42 43 print("Disconnected") 44 except KeyboardInterrupt: 45 self.s.close() 46 47 48 class UDPServer(BaseServer): 49 def __init__(self, bind, handler): 50 super().__init__(bind, handler) 51 self.s = socket(AF_INET, SOCK_DGRAM) 52 self.s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 53 self.s.bind(bind) 54 55 def start(self): 56 try: 57 while True: 58 try: 59 self.handler.handle(self.s) 60 except Exception as e: 61 print("\x1b[31m" + format_exc() + "\x1b[m") 62 63 except KeyboardInterrupt: 64 self.s.close() 65 66 67 def server(mode, bind, handler): 68 if mode == "tcp": 69 server = TCPServer 70 elif mode == "udp": 71 server = UDPServer 72 else: 73 raise ValueError("Server mode can be either tcp or udp") 74 75 print(f"Opening {mode.upper()} server at {bind[0]}:{bind[1]}") 76 77 server(bind, handler).start() 78 79 80 if __name__ == '__main__': 81 parser = ArgumentParser() 82 parser.add_argument("--mode", choice=("tcp", "udp"), default="tcp") 83 parser.add_argument("--port", type=int, default=1234) 84 args = parser.parse_args() 85 86 server(args.mode, ('127.0.0.1', args.port), BaseHandler())