Статьи

Уведомления в реальном времени (часть II). Теперь с node.js и socket.io

В одном из моих предыдущих постов я писал об уведомлениях в реальном времени с помощью PHP . Я хотел создать простую кометную систему, полностью написанную на PHP и JavaScript. Это сработало, но, как Скотт Мэттокс сказал мне в комментарии, эта реализация все еще просто делала короткий опрос. Производительность с этим решением может быть плохой на сайте со средним / высоким трафиком. В эти дни я играю с node.js и хочу создать простой тест. Я хочу сделать то же самое, что и в предыдущем посте, но теперь с node.js вместо моего теста PHP + js. Давайте начнем

Теперь я хочу использовать socket.io вместо чистых веб-сокетов, как мои предыдущие посты о node.js. Для тех, кто не знает, socket.io — это удивительная библиотека, которая позволяет нам использовать технологии реального времени в любых браузерах (да, даже с IE6). Он использует ту или иную технологию в зависимости от браузера, который мы используем, с тем же интерфейсом для разработчика. Это означает, что если мы используем Google Chrome, мы будем использовать веб-сокеты, но если наш браузер не поддерживает их, socket.io выберет другой поддерживаемый транспорт. Определенно socket.io — это jQuery веб-сокетов. Сторонниками транспорта являются:

  • WebSocket
  • Adobe Flash Socket
  • AJAX длинный опрос
  • Многочастная потоковая передача AJAX
  • Навсегда Ифраме
  • JSONP Polling

Сначала мы создаем наш сервер node.js. Действительно простой.

var http = require('http');
var io = require('socket.io');

server = http.createServer(function(req, res){
});
server.listen(8080);

// socket.io
var socket = io.listen(server);

socket.on('connection', function(client){
client.on('message', function(msg){
socket.broadcast(msg);
})
});

Этот сервер будет транслировать сообщение, полученное из браузера, всем подключенным клиентам.

Наша HTML-страница будет выглядеть так:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Comet Test</title>
</head>
<body>
<p><a id='customAlert' href="#" onclick='socket.send("customAlert")'>publish customAlert</a></p>
<p><a id='customAlert2' href="#" onclick='socket.send("customAlert2")'>publish customAlert2</a></p>
<script src="http://localhost:8080/socket.io/socket.io.js" type="text/javascript"></script>
<script type="text/javascript">

// Start the socket
var socket = new io.Socket(null, {port: 8080});
socket.connect();

socket.on('message', function(msg){
console.log(msg);
});
</script>
</body>
</html>

 

Как мы видим, мы включаем js-скрипт с именем socket.io/socket.io.js. Этот скрипт обслуживается нашим сервером узлов.

Фактически мы можем использовать наш node.js для обслуживания всего (HTML, js, CSS), но в нашем примере мы будем использовать только node.js для работы в режиме реального времени. Apache будет обслуживать остальную часть кода (в данном случае только HTML-файл).

И это все. Эти несколько строк выполняют то же самое, что и наш код PHP и js в примере другого поста . Наша реализация node.js определенно умнее PHP. Библиотека socket.io также позволяет использовать пример со всеми браузерами. Тот же код и без кошмара браузера (как jQuery, когда мы работаем с DOM).

Здесь у меня есть небольшой скринкаст с рабочим примером. Как мы увидим, мы подключимся к серверу узлов с помощью Firefox и Chrome. Firefox будет использовать xhr multipart, а Chrome — Websokets.

Еще одна важная проблема библиотеки socket.io заключается в том, что мы забываем о переподключении к серверу веб-сокетов, если что-то не так (как мы видим в мониторинге PHP-приложений в реальном времени с помощью web-сокетов и node.js ). Если мы используем необработанные реализации WebSocket и наше соединение с сервером веб-сокетов разрывается или если мы остановим сервер, наше приложение вызовет событие отключения, и нам нужно будет создать что-то для повторного подключения к серверу. socket.io делает это для нас. С нашим небольшим фрагментом кода JavaScript мы получим высокопроизводительное приложение в реальном времени. Узел это круто. Очень круто. В некотором роде странный в начале, но усилия обучения будут стоить. Несколько строк JS и приложения в реальном времени.

У меня проблема в нашем приложении node.js. Если у нас есть какая-то защита в нашем приложении (представьте, например, что она находится за формой авторизации на основе сеанса), нам нужно поделиться этим уровнем безопасности с нашим сервером node.js, чтобы гарантировать, что не прошедшие проверку пользователи не смогут использовать наш WebSockets. Я не знаю, как это сделать сейчас, но я расследую. Есть ли у вас какие-либо идеи?

Полный код Код на GitHub . Убедитесь, что вы используете стабильную версию node.js. В последней версии, доступной на github для node.js, есть ошибка, и сервер умирает, когда мы соединяемся с Google Chrome.

 

От http://gonzalo123.wordpress.com/2011/05/23/real-time-notifications-part-ii-now-with-node-js-and-socket-io/