我正在创建一个简单的 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
我想知道一种实现是否比另一种更可取,为什么,以及是否可以以某种方式实现更好。
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
模块记录错误)