将套接字传递给函数并修改它,或者在函数内创建套接字并返回它

问题描述 投票:0回答:1

我正在创建一个简单的 python ASGI 服务器,我对创建服务器套接字的函数的实现有疑问。

我应该在函数内创建服务器的套接字并像这样返回它:

class Server:
    def __init__(self, host: Optional[str] = None,
                 port: Optional[int] = None,
                 debug_mode: bool = False) -> None:
        self.host = host if host is not None else socket.gethostbyname('localhost')
        self.port = port if port is not None else 8000
        self.server_sock = self.initialize_server()
        self.debug_mode = debug_mode

    def initialize_server(self) -> Optional[socket.socket]:
        try:
            server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            server_sock.setblocking(False)
            server_sock.bind((self.host, self.port))
            return server_sock
        except socket.error as e:
            return None

或者我应该将一个空套接字对象传递给函数,修改它,如下所示:

class Server:
    def __init__(self, host: Optional[str] = None,
                 port: Optional[int] = None,
                 debug_mode: bool = False) -> None:
        self.host = host if host is not None else socket.gethostbyname('localhost')
        self.port = port if port is not None else 8000
        self.server_sock = None
        self.initialize_server()
        self.debug_mode = debug_mode

    def initialize_server(self) -> Optional[socket.socket]:
        try:
            self.server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self.server_sock.setblocking(False)
            self.server_sock.bind((self.host, self.port))
        except socket.error as e:
            self.server_sock = None

我想知道一种实现是否比另一种更可取,为什么,以及是否可以以某种方式实现更好。

python function sockets object methods
1个回答
0
投票

IMO,在使用您的

initialize_server
方法后,您稍后可能会使用 socked。因此,您应该保留第二个片段,以避免不断地将服务器和套接字传递给针对此连接的每个函数。

输入更正后,我最喜欢的选项是:

class Server:
    def __init__(self, host: Optional[str] = None,
                 port: int = 8000,
                 debug_mode: bool = False) -> None:
        self.host = host if host is not None else socket.gethostbyname('localhost')
        self.port: int = port
        self.server_sock: Optional[socket.socket] = None
        self.initialize_server()
        self.debug_mode = debug_mode

    def initialize_server(self) -> None:
        try:
            self.server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self.server_sock.setblocking(False)
            self.server_sock.bind((self.host, self.port))
        except socket.error as e:
            self.server_sock = None

还有一个建议,开始记录处理套接字时的所有内容(例如:在异常处,您应该通过

logging
模块记录错误)

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.