src/eric7/RemoteServer/EricServer.py

branch
server
changeset 10563
b4b47c1a02ba
parent 10561
be23a662d709
child 10565
3583a10ce4d4
diff -r be23a662d709 -r b4b47c1a02ba src/eric7/RemoteServer/EricServer.py
--- a/src/eric7/RemoteServer/EricServer.py	Sun Feb 11 18:35:44 2024 +0100
+++ b/src/eric7/RemoteServer/EricServer.py	Mon Feb 12 18:09:53 2024 +0100
@@ -68,13 +68,8 @@
         # TODO: 'Project' handler not implemented yet
         # TODO: implement an 'EditorConfig' handler (?)
 
-        address = ("", port)
-        if socket.has_dualstack_ipv6() and useIPv6:
-            self.__socket = socket.create_server(
-                address, family=socket.AF_INET6, dualstack_ipv6=True
-            )
-        else:
-            self.__socket = socket.create_server(address, family=socket.AF_INET)
+        self.__address = ("", port)
+        self.__useIPv6 = useIPv6
 
     def getSelector(self):
         """
@@ -150,7 +145,7 @@
         @rtype bytes
         """
         data = bytearray()
-        while len(data) < length:
+        while sock is not None and len(data) < length:
             try:
                 newData = sock.recv(length - len(data))
                 if not newData:
@@ -264,6 +259,36 @@
     ## Methods for the server main loop.
     #######################################################################
 
+    def __initializeIdeSocket(self):
+        """
+        Private method to initialize and register the eric-ide server socket.
+        """
+        if socket.has_dualstack_ipv6() and self.__useIPv6:
+            self.__socket = socket.create_server(
+                self.__address, family=socket.AF_INET6, backlog=0, dualstack_ipv6=True
+            )
+        else:
+            self.__socket = socket.create_server(
+                self.__address, family=socket.AF_INET, backlog=0
+            )
+
+        self.__socket.listen(0)
+        self.__socket.setblocking(False)
+        print(f"Listening for 'eric-ide' connections on {self.__socket.getsockname()}")
+        data = types.SimpleNamespace(
+            name="server", acceptHandler=self.__acceptIdeConnection
+        )
+        self.__selector.register(self.__socket, selectors.EVENT_READ, data=data)
+
+    def __unregisterIdeSocket(self):
+        """
+        Private method to unregister the eric-ide server socket because only one
+        connection is allowed.
+        """
+        self.__selector.unregister(self.__socket)
+        self.__socket.shutdown(socket.SHUT_RDWR)
+        self.__socket.close()
+
     def __shutdown(self):
         """
         Private method to shut down the server.
@@ -283,14 +308,23 @@
         @param sock reference to the listening socket
         @type socket.socket
         """
-        self.__connection, address = sock.accept()  # Should be ready to read
-        print(f"'eric-ide' connection from {address[0]},  port {address[1]}")
-        self.__connection.setblocking(False)
-        data = types.SimpleNamespace(
-            name="eric-ide", address=address, handler=self.__serviceIdeConnection
-        )
-        events = selectors.EVENT_READ
-        self.__selector.register(self.__connection, events, data=data)
+        connection, address = sock.accept()  # Should be ready to read
+        if self.__connection is None:
+            print(f"'eric-ide' connection from {address[0]},  port {address[1]}")
+            self.__connection = connection
+            self.__connection.setblocking(False)
+            data = types.SimpleNamespace(
+                name="eric-ide", address=address, handler=self.__serviceIdeConnection
+            )
+            events = selectors.EVENT_READ
+            self.__selector.register(self.__connection, events, data=data)
+
+            self.__unregisterIdeSocket()
+        else:
+            print(
+                f"'eric-ide' connection from {address[0]},  port {address[1]} rejected"
+            )
+            connection.close()
 
     def __closeIdeConnection(self):
         """
@@ -311,6 +345,8 @@
 
             self.__debuggerRequestHandler.shutdownClients()
 
+        self.__initializeIdeSocket()
+
     def __serviceIdeConnection(self, key):
         """
         Private method to service the eric-ide connection.
@@ -348,15 +384,10 @@
         cleanExit = True
         self.__shouldStop = False
 
-        # listen on the server socket for new connections
-        self.__socket.listen(1)
-        self.__socket.setblocking(False)
-        print(f"Listening for 'eric-ide' connections on {self.__socket.getsockname()}")
-        data = types.SimpleNamespace(
-            name="server", acceptHandler=self.__acceptIdeConnection
-        )
-        self.__selector.register(self.__socket, selectors.EVENT_READ, data=data)
+        # initialize the eric-ide server socket and listen for new connections
+        self.__initializeIdeSocket()
 
+        # initialize the debug client server socket
         self.__debuggerRequestHandler.initServerSocket()
 
         while True:

eric ide

mercurial