Когда ваш браузер отправляется в http://localhost/, вам нужен веб-сервер, который будет отвечать на запросы в браузере с помощью веб-страницы. Вот что делали Express и линии express.static()
. Когда вы удаляете их, у вас действительно есть сервер, который слушает соединения webSocket по определенному пути, но у вас нет каких-либо обслуживающих веб-страниц. Итак, когда браузер переходит к http://localhost/, ничего не возвращается с простой веб-страницей.
Также, зачем мне нужен HTTP-сервер, когда Socket.IO использует протокол WebSocket ?
Все соединения socket.io начинаются с запроса HTTP. socket.io основан на протоколе webSocket, и все соединения webSocket инициируются с помощью HTTP-запроса. Таким образом, чтобы принять соединение socket.io, вам нужен веб-сервер, который отвечает на HTTP-запрос, и тогда вам нужен веб-сервер, достаточно интеллектуальный, чтобы распознать запрос на подключение к веб-сокету, чтобы он мог «обновить» протокол от HTTP к webSocket.
Для хорошо написанного обзора того, как устанавливается соединение через Интернет, см. this overview on MDN.
Инфраструктура socket.io затем запускается поверх этого webSocket после его подключения.
Я знаю, что он создает сервер, к которому клиенты могут подключаться, и он работает. Но я не знаю, что именно происходит. Можете ли вы объяснить подробно?
Вот строка за строкой объяснение кода:
express = require('express');
Это загружает библиотеку Экспресс.
app = express();
Это создает app
объект Express, который может быть использован в качестве обработчика запроса WebServer.
http = require('http').createServer(app);
Это создает веб-сервер и передает ему объект Экспресс app
как обработчик запроса WebServer.
io = require('socket.io')(http);
Это крючки Socket.io в ваш веб-сервер в качестве другого обработчика запроса, чтобы он мог видеть все входящие запросы HTTP, которые на самом деле первый этап запуска WebSocket/Socket.io соединение.
app.use(express.static(__dirname + '/'));
Это говорит Экспресс, что если запрос сделан на веб-странице, что она должна выглядеть в __dirname для файла, который соответствует запрошенной путь. Если он найден, он должен вернуть этот путь.
http.listen(80);
Это запускает веб-сервер прослушивает порт 80.
Ни один из них не работают с одной строки кода на стороне сервера.
Обе эти строки кода для создания соединения socket.io будут работать при правильном использовании. Вы не говорите, как выполняется этот код. Если вы пытаетесь запустить этот код с веб-страницы, загруженной браузером от http://localhost/, то я уже объяснил, почему эта веб-страница не загружается, если вы не запускаете Express. Если вы пытаетесь запустить эти строки кода с веб-страницы, загруженной каким-либо другим способом, то у вас, вероятно, есть проблема с одинаковым источником безопасности, так как браузер по умолчанию не позволит вам получить доступ к домену, который отличается от из которого вышла веб-страница.
В случае, если кому-то интересно, __dirname - это каталог, в котором сервер работает. –