В этой статье мы рассмотрим, как настроить сервер Node.js + socket.io как в сети, так и в рабочих ролях (если вы не знакомы с тем, что такое веб-и рабочая роли, прочитайте следующую статью MSDN ) ,
Оба подхода работают практически с одним и тем же кодом (с незначительной настройкой для отключения WebSockets в веб-ролях), что приводит к решению о том, что выбрать, в зависимости только от ваших собственных требований и потребностей.
Вы начинаете с базового шаблона «Hello World», созданного командлетом Windows Azure Powershell для Node.js для разработки обеих ролей с соответствующими изменениями для отправки сообщений через socket.io . Мы создали клиентское приложение, которое вы можете использовать, чтобы проверить, что все в порядке; он просто открывает соединение с сервером (веб-роль или рабочая роль) и показывает полученные сообщения.
Подключение к серверу socket.io
Ниже приведен код JavaScript для очень простого клиента. Обратите внимание, что он очищает ярлык, который сохраняет сообщение каждый раз, когда вы нажимаете кнопку. Таким образом, вы можете легко определить, сколько потребуется всего потока emit-receive для завершения. Не забудьте указать URL-адрес сервера и порт.
<script type="text/javascript"> var socket; $(document).ready(function () { $("#startButton").click(function () { $("#returnMessageLabel").empty(); if (!socket) { socket = io.connect("http://<YOUR-SERVER-URL>:<YOUR-PORT>/"); socket.on('helloBack', function (data) { $("#returnMessageLabel").text(data.message); }); } socket.emit('sendMessage', { message: 'Hello there!' }); }); }); </script>
Вы должны получить что-то вроде этого:
Теперь давайте посмотрим на код сервера.
Запуск на рабочей роли Windows Azure
Подход «рабочая роль» довольно прост. Вам просто нужно установить модуль socket.io на роль и заменить код в файле server.js следующим:
server.js
var port = process.env.port || 81; var app = require('http').createServer(handler) , io = require('socket.io').listen(app) app.listen(port); console.log('socket.io server started on port: ' + port + '\n'); function handler (req, res) { res.writeHead(200); res.end('socket.io server started on port: ' + port + '\n'); } io.sockets.on('connection', function (socket) { console.log('user connected'); socket.on('sendMessage', function(data){ console.log('user sent the message: ' + data.message + '\n'); socket.emit('helloBack', { message: 'Hello back!' }); }); });
Как видите, в Windows Azure нет ничего конкретного. Мы развернули это на очень маленьком экземпляре в Windows Azure и протестировали его с Internet Explorer 9 и Google Chrome.
Поскольку Internet Explorer 9 не поддерживает WebSockets (IE10 будет), он будет ухудшать соединение с xhr-опросом. По умолчанию socket.io настроен на использование следующих транспортов (в этом порядке): websocket , htmlfile , xhr-polling и jsonp-polling
Запуск в веб-роли Windows Azure
Если вы разместите socket.io в веб-роли, вам придется отключить транспорт WebSockets на сервере. Это связано с тем, что веб-роли выполняются в предварительно настроенном IIS7, а IIS пока не поддерживает веб-сокеты. Переопределите транспортный механизм, чтобы использовать, например, xhr-опрос с 10 сек. продолжительность опроса. Независимо от того, какой клиент пытается подключиться к серверу, это будет используемый транспортный метод.
Чтобы настроить транспорт, добавьте фрагмент кода в файл server.js с тем же кодом, который вы использовали в подходе рабочей роли, но добавьте следующие строки в конце файла:
server.js
... io.configure(function () { io.set("transports", ["xhr-polling"]); io.set("polling duration", 10); });
Если вы не добавите это исправление, у вас возникнет некоторая начальная задержка в браузерах, которые поддерживают WebSockets (например, Chrome). Эта задержка генерируется, потому что он попытается использовать WebSockets в качестве первого варианта.
Кроме того, вы можете настроить массив разрешенных методов (вместо одного), используя следующий код:
server.js
io.configure(function () { io.set('transports', [ 'xhr-polling' , 'jsonp-polling' , 'htmlfile' ]); io.set("polling duration", 10); });
Вывод
Подводя итог тому, что мы узнали в этой статье:
- Вы можете разместить socket.io в Windows Azure
- Он работает как в рабочих, так и в веб-ролях.
- Если браузер поддерживает WebSockets, он сначала попытается это сделать.
- Если вы используете веб-роль, не забудьте отключить транспорт WebSockets, поскольку IIS в настоящее время не поддерживает его.
Источник: http://nodeblog.cloudapp.net/running-socket-io-on-windows-azure-web-and-worker-roles