2016-02-13 2 views
0

У меня есть следующий код:Сервер Node.js для Socket.IO объяснения?

express = require('express'); 
app = express(); 
http = require('http').createServer(app); 
io = require('socket.io')(http); 

app.use(express.static(__dirname + '/')); 
http.listen(80); 

Я знаю, что это создает сервер, клиенты могут подключиться к и она работает. Но я не знаю, что именно происходит. Можете ли вы объяснить подробно?

Кроме того, почему-то не работает, когда я забыл о Express.js и просто использовать эту строку:

io = require('socket.io').listen(80); 

Он появляется для прослушивания соединений. Однако в браузере, когда я перехожу на http://localhost/, ничего не происходит. Я предполагаю, что я не указываю каталог для своего приложения вроде этого:

app.use(express.static(__dirname + '/')); 

Именно поэтому мне нужен экспресс? Чтобы указать каталог?

На клиенте, я использую:

socket = io('http://localhost/'); // this 
socket = io(); // or this 

Ни один из них не работает с одной строки кода на стороне сервера.

Кроме того, для чего нужен HTTP-сервер, когда Socket.IO использует протокол WebSocket?

ответ

4

Когда ваш браузер отправляется в 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. Если вы пытаетесь запустить эти строки кода с веб-страницы, загруженной каким-либо другим способом, то у вас, вероятно, есть проблема с одинаковым источником безопасности, так как браузер по умолчанию не позволит вам получить доступ к домену, который отличается от из которого вышла веб-страница.

+0

В случае, если кому-то интересно, __dirname - это каталог, в котором сервер работает. –

2

Вам нужен экспресс-сервер http для доставки клиента сокета в браузер.

  • сервер Экспресс начинается на порту 80

  • браузер подключается, чтобы выразить через порт 80, компонент socket.io сервер доставляет сокет клиента Javascript в браузере (http://localhost:80/socket.io/socket.io.js)

  • Разъем клиента (в браузере), затем можно подключиться к серверу socket.io