Quellcode durchsuchen

implemented async server

digital vor 8 Jahren
Ursprung
Commit
65bce1bcc1
1 geänderte Dateien mit 76 neuen und 40 gelöschten Zeilen
  1. 76 40
      network/__init__.py

+ 76 - 40
network/__init__.py

@@ -116,8 +116,9 @@ class Server(object):
         self.conn_to_handler ={}
         self.handler_to_conn = {}
         self.read_sockets_expected = [self.socket]
-        self.write_sockets_expected = []
-        self.exc_sockets_expected = []
+
+    def cleanup(self):
+        pass
 
     def make_socket(self):
         lserver.debug("making a {} socket".format(self.af_family))
@@ -173,53 +174,88 @@ class Server(object):
         self.socket.listen(self.max_allowed_clients)
         # self.socket.settimeout(1)
 
-    def run(self):
+    def start(self):
+        curio.run(self.run):
+
+    async def run(self):
         self.setup()
         lserver.debug("entering main loop")
         while ( not self.exit_event ):
             # lserver.debug(self.read_sockets_expected)
             # lserver.debug(self.write_sockets_expected)
             # lserver.debug(self.exc_sockets_expected)
-            read_sockets_confirmed, \
-            write_sockets_confirmed, \
-            exc_sockets_confirmed \
-                = select.select(self.read_sockets_expected,
-                            self.write_sockets_expected,
-                            self.exc_sockets_expected,
-                )
-            for s in read_sockets_confirmed:
-                socket_handler = self.conn_to_handler.get(s, None)
-                if ( s == self.socket ):
-                    lserver.debug("handling new client")
-                    conn, addr = self.socket.accept()
+            # read_sockets = select.select(self.read_sockets_expected,[],[])
+            lserver.debug("waiting for client to connect")
+            conn,addr = await self.socket.accept()
+            if self.log_ip:
+                lserver.info(
+                    "new client connection, {}:{}!".format(*addr))
+            else:
+                lserver.info("a new client connected, let's handle it")
+            handler = self.make_handler(conn, addr)
+            self.register_conn(conn, addr)
+            self.register_handler(handler, conn)
+            await cutio.spawn(self.loop(conn))
+
+            # for s in read_sockets_confirmed:
+            #     socket_handler = self.conn_to_handler.get(s, None)
+            #     if ( s == self.socket ):
+            #         lserver.debug("handling new client")
+            #         conn, addr = self.socket.accept()
+            #         if self.log_ip:
+            #             lserver.info(
+            #                 "New connection from {} on port {}".format(*addr))
+            #         handler = self.make_handler(conn, addr)
+            #         self.register_conn(conn, addr)
+            #         self.register_handler(handler, conn)
+            #     elif ( socket_handler
+            #             and (socket_handler in self.connection_handler) ):
+            #         lserver.debug("handling client connection")
+            #         try:
+            #             data = socket_handler.recv()
+            #             if not data:
+            #                 lserver.info("connection {} closed".format(self.socket))
+            #                 self.unregister_handler(socket_handler, s)
+            #                 self.unregister_conn(conn)
+            #                 socket_handler.close()
+            #             else:
+            #                 lschat.info("Client:"+data.strip())
+            #                 socket_handler.handle(data)
+            #         except Exception as e:
+            #             lserver.error(e, exc_info=True)
+            #     else:
+            #         lserver.debug("else!")
+            #         lserver.debug(socket_handler)
+            #         time.sleep(1)
+
+        async def wait_for_client(self,socket,handler):
+            while True:
+                try:
                     if self.log_ip:
-                        lserver.info(
-                            "New connection from {} on port {}".format(*addr))
-                    handler = self.make_handler(conn, addr)
-                    self.register_conn(conn, addr)
-                    self.register_handler(handler, conn)
-                elif ( socket_handler
-                        and (socket_handler in self.connection_handler) ):
-                    lserver.debug("handling client connection")
-                    try:
-                        data = socket_handler.recv()
-                        if not data:
-                            lserver.info("connection {} closed".format(self.socket))
-                            self.unregister_handler(socket_handler, s)
-                            self.unregister_conn(conn)
-                            socket_handler.close()
+                        lserver.debug(
+                            "waiting for {} to send something"
+                            .format(socket.getsockname()))
+                    else:
+                        lserver.debug(
+                            "waiting for the client to send something")
+                    data = await handler.recv()
+                    if not data:
+                        if self.log_ip:
+                            lserver.info(
+                                "the connection to {} was closed"
+                                .format(socket.getsockname()))
                         else:
-                            lschat.info("Client:"+data.strip())
-                            socket_handler.handle(data)
-                    except Exception as e:
-                        lserver.error(e, exc_info=True)
-                else:
-                    lserver.debug("else!")
-                    lserver.debug(socket_handler)
-                    time.sleep(1)
+                            lserver.info(
+                                "the connection to the client was closed")
+                        self.unregister_handler(handler, socket)
+                        self.unregister_conn(socket)
+                        handler.close()
+                    else:
+                        lschat.info("Client:"+data.strip())
+                        socket_handler.handle(data)
+            except Exception as e:
+                    lserver.error(e, exc_info=True)
 
-        def cleanup(self):
-            pass
 
 class Client(threading.Thread):
     """docstring for Client"""