На Mac проверьте адрес прослушивания сервера с помощью lsof, затем — при необходимости — попробуйте подключиться к IP-адресу Wi-Fi или Ethernet вашего Mac с другого устройства в той же сети. Loopback-адрес, такой как 127.0.0.1 или ::1, работает только локально; wildcard-адрес, такой как 0.0.0.0 или ::, может принимать подключения через сетевые интерфейсы. Прежде чем делать выводы о доступности сервера, подтвердите фактический адрес и протестируйте конкретный порт.
1. Найдите адрес прослушивания сервера
При запущенном сервере разработки откройте «Терминал» и выполните следующую команду, заменив 8000 на номер его порта:
lsof -nP -iTCP:8000 -sTCP:LISTEN
Команда lsof выводит список открытых файлов, включая сетевые сокеты; фильтр состояния TCP позволяет выбрать сокеты в режиме прослушивания. Параметры -nP сохраняют адреса в числовом формате и предотвращают отображение номеров портов в виде имен служб. Руководство Apple по lsof
Обратите внимание на столбец NAME. Результат, заканчивающийся на 127.0.0.1:8000 (LISTEN), означает привязку к loopback-адресу IPv4. Значение localhost:8000 также указывает на прослушивание loopback-интерфейса, хотя отображаемое имя может различаться. Результат вида *:8000 указывает на wildcard-прослушиватель для соответствующего семейства адресов. Обратите внимание и на столбец TYPE: отдельные строки для IPv4 и IPv6 могут иметь значение. ::1 — это loopback IPv6; :: — это wildcard-адрес IPv6. В некоторых системах wildcard-прослушиватель IPv6 также может принимать подключения по IPv4, поэтому один лишь вывод команды не всегда позволяет сделать однозначный вывод.
Если команда ничего не выводит, убедитесь, что сервер по-прежнему работает, что указан его текущий порт и что он прослушивает протокол TCP. Эта команда не проверяет прослушиватели UDP. Если lsof не возвращает результатов без повышенных привилегий, перезапустите её с sudo, но только в том случае, если требуется проверить процессы, принадлежащие другой учетной записи; macOS может запросить пароль для входа.
2. Анализ адреса как признака доступности
Сокет, привязанный к определенному loopback-адресу, принимает подключения, направленные на этот loopback-интерфейс, а не на адрес вашего Mac в локальной сети. Wildcard-адрес означает, что сокет не ограничен loopback-интерфейсом, а значит, может быть доступен через сетевой интерфейс. Apple описывает прослушивающий сокет как сокет, ожидающий входящих подключений. Обзор серверов на базе TCP от Apple
Wildcard-адрес не гарантирует, что другое устройство сможет подключиться. Сервер всё равно должен работать на этом порту; настройки брандмауэра macOS, изоляция клиентов на маршрутизаторе или Wi-Fi, а также другие сетевые факторы могут повлиять на подключение. И наоборот, успешная проверка через браузер на Mac с использованием localhost доказывает лишь работоспособность локального подключения.
3. Проверьте доступ с другого устройства в вашей сети
Узнайте адрес Mac для сети, которую требуется протестировать. Для Wi-Fi определение IP-адреса подключения описано в документации Apple: в настройках Wi-Fi или в меню статуса Wi-Fi; точные элементы управления могут зависеть от версии macOS. Руководство по настройкам Wi-Fi от Apple
Со второго устройства, подключенного к той же локальной сети, откройте браузер или используйте HTTP-клиент для запроса http://MAC-IP:8000, подставив текущий адрес Mac и порт сервера. Например, если адрес Mac в локальной сети — 192.168.1.23, а порт — 8000, попробуйте перейти по адресу http://192.168.1.23:8000. Получение ответа показывает, что клиент смог подключиться к сервису по этому маршруту; таймаут или отказ в подключении сами по себе не определяют причину сбоя. Убедитесь, что оба устройства находятся в нужной сети, и повторно проверьте прослушиваемый адрес, прежде чем разбираться с настройками брандмауэра или сети.
4. Явно задайте привязку только к локальному интерфейсу, если это поддерживается
Правильная настройка задается в конфигурации самого сервера разработки, а не универсальным переключателем macOS. Например, модуль Python http.server поддерживает параметр --bind; в его документации указано, что по умолчанию выполняется привязка ко всем интерфейсам, тогда как следующая команда привязывает сервер к loopback-адресу IPv4:
python3 -m http.server --bind 127.0.0.1 8000
Это работает, если установлен Python 3. В документации Python описаны как параметр bind, так и его поведение по умолчанию. Документация http.server в Python
Другие инструменты предоставляют собственные параметры узла (host) или привязки (bind). В документации Node.js указано, что отсутствие указания хоста в server.listen() приводит к выбору неопределенного адреса, при этом поведение зависит от доступности IPv6. Ознакомьтесь с документацией для используемого сервера и версии; не следует рассчитывать на то, что флаг из другого фреймворка сработает аналогично. Документация Node.js net.Server После изменения настройки перезапустите сервер и повторите проверку с помощью lsof. Тестирование в локальной сети полезно, если планируется предоставить общий доступ, однако привязка к адресу локальной сети или wildcard-адресу может открыть доступ к сервису разработки для других устройств в сети.
Источники
Руководство по lsof — Apple Open Source
Using Sockets and Socket Streams — Apple Developer
Настройки Wi-Fi на Mac — Служба поддержки Apple
http.server— HTTP-серверы — Python Software FoundationNet | Документация Node.js v20.20.2 — OpenJS Foundation