在 Mac 上,使用 lsof 检查服务器的监听地址,然后(如有需要)尝试从同一网络上的另一台设备连接到 Mac 的 Wi-Fi 或以太网 IP。类似 127.0.0.1 或 ::1 的环回地址仅限本地访问;类似 0.0.0.0 或 :: 的通配符地址可以通过网络接口接受连接。在断定服务器的访问范围之前,请确认实际地址并测试具体端口。

1. 查找服务器的监听地址

在开发服务器运行的情况下,打开终端并运行以下命令,将 8000 替换为其端口:

lsof -nP -iTCP:8000 -sTCP:LISTEN

lsof 会列出打开的文件,包括网络套接字;其 TCP 状态筛选器可以选择监听器。-nP 选项可保持地址为数字形式,并防止端口号显示为服务名称。Apple 的 lsof 手册

查看 NAME 列。以 127.0.0.1:8000 (LISTEN) 结尾的结果绑定到了 IPv4 环回地址。localhost:8000 也表示环回监听器,不过显示的名称可能会有所不同。显示 *:8000 的结果是该地址族的通配符监听器。还要检查 TYPE 列:单独的 IPv4 和 IPv6 行可能有所不同。::1 是 IPv6 环回;:: 是 IPv6 通配符。在某些系统上,IPv6 通配符监听器也可能接受 IPv4 连接,因此仅凭列表本身可能无法确定这一细节。

如果命令没有返回任何内容,请检查服务器是否仍在运行、使用的端口是否正确,以及它是否在 TCP 上监听。此命令不检查 UDP 监听器。如果 lsof 在没有提权的情况下未显示任何结果,仅当需要检查归属于其他账户的进程时,才使用 sudo 重新运行;macOS 可能会要求输入你的登录密码。

2. 将地址作为可访问性的线索来解读

绑定到特定环回地址的监听器仅接受发往该环回接口的连接,而不接受发往 Mac 局域网地址的连接。通配符地址意味着套接字不局限于环回,因此它可能可以通过网络接口访问。Apple 将监听套接字描述为等待传入连接的套接字。Apple 的基于 TCP 的服务器概述

通配符并不能证明其他设备一定可以连接。服务器仍必须在该端口上运行;macOS 防火墙设置、路由器或 Wi-Fi 客户端隔离以及其他网络状况都可能影响连接。反过来,在 Mac 上使用 localhost 成功进行浏览器测试,也仅能证明本地连接正常。

3. 从网络上的另一台设备测试访问

查找要测试的网络对应的 Mac 地址。对于 Wi-Fi,Apple 记录了在 Wi-Fi 设置或 Wi-Fi 状态菜单中查找连接的 IP 地址的方法;具体控制选项可能因 macOS 版本而异。Apple 的 Wi-Fi 设置指南

从连接到同一局域网的第二台设备打开浏览器或使用 HTTP 客户端请求 http://MAC-IP:8000,将其中的内容替换为 Mac 的当前地址和服务器的端口。例如,如果 Mac 的局域网地址为 192.168.1.23,端口为 8000,请尝试访问 http://192.168.1.23:8000。收到响应表明该客户端通过该路由访问到了服务;超时或拒绝连接本身并不能确定具体原因。在排查防火墙或网络设置之前,请确认两台设备都在目标网络上,并重新检查监听器。

4. 在支持的情况下显式进行仅本地绑定

正确的设置归属于开发服务器本身,而非通用的 macOS 开关。例如,Python 的 http.server 支持 --bind;其文档说明默认绑定到所有接口,而以下命令会绑定到 IPv4 环回:

python3 -m http.server --bind 127.0.0.1 8000

如果安装了 Python 3,此命令即可生效。Python 同时说明了 bind 选项及其默认行为。Python http.server 文档

其他工具也有各自的主机或绑定设置。Node.js 的文档指出,如果从 server.listen() 中省略 host,则会选择未指定的地址,具体行为取决于 IPv6 的可用性。请查阅适合你的服务器和版本的文档;切勿假设其他框架的标志同样适用。Node.js net.Server 文档 更改设置后,重启服务器并重复 lsof 检查。当你打算共享访问权限时,进行局域网测试非常有用,但绑定到局域网或通配符地址可能会将开发服务暴露给其他可访问的设备。

来源