Я хотел бы запустить сервер XAMPP и сервер Nodejs на порту 80.
Если сервер получит HTTP-запрос, то XAMPP обработает его, если сервер получит запрос Websocket, тогда Nodejs
Как это возможно? Если порт уже используется, я не могу запустить другую серверную программу.
Для этого вам нужно будет использовать обратный прокси, например Apache 2.4. с участием mod_proxy_wstunnel.
Используйте его в качестве внешнего интерфейса, а затем туннелируйте подключения к соответствующему внутреннему интерфейсу.
Только один процесс может прослушивать определенный порт для одного и того же IP-адреса и протокола, потому что в противном случае операционная система не знала бы, в какой процесс отправить полученный пакет.
Чтобы достичь того, чего вы хотите, вам придется использовать обратный прокси который будет прослушивать порт 80 и перенаправлять трафик в правильное место назначения. Есть несколько способов сделать это. Например, вы можете настроить свой веб-сервер (Apache) для пересылки запросов WebSocket или настроить Node.js для пересылки HTTP-трафика. Изучите доступные варианты и выберите тот, который лучше всего соответствует вашим потребностям.
Помимо варианта обратного прокси-сервера, о котором уже упоминали другие, вы можете назначить машине несколько IP-адресов. Это может стоить для IPv4 (или просто быть недоступным в зависимости от того, где размещен ваш сервер), но не должно, если вы в состоянии использовать IPv6 (т.е. если люди, подключающиеся к одному или обоим, или ваши службы будут поддерживать IPv6) . Таким образом, обе службы могут прослушивать порт 80 по разным адресам.
Поскольку вы упоминаете только порт 80, я предполагаю, что вы не используете HTTPS. Если вы используете опцию обратного прокси-сервера, вам необходимо либо иметь сертификат SSL с несколькими именами, либо настроить SNI и жить с тем фактом, что некоторые старые клиенты (IE на XP, старые версии Android) не смогут подключиться без ошибок. Опция множественного адреса позволяет обойти эту проблему за счет необходимости назначать дополнительный адрес (а).