Проблема с подключением к веб-приложению socket.io azure
У меня есть приложение js для socket.io v0.9.17, развернутое на Azure (которое я тестировал локально с двумя клиентами и оно работает нормально) со следующим кодом:
var util = require("util");
var port = process.env.PORT || 1337;
var app = require("http").createServer(function (req, res) {
res.writeHead(200, { "Content-Type": "text/plain" });
res.end("Socket.io application");
}).listen(port);
var io = require('socket.io').listen(app);
io.configure(function () {
io.set("transports", ["websocket"]);
});
io.sockets.on('connection', function (client) { ... }
Я пытаюсь подключиться к нему через socket.io-java-client с помощью:
// Have tested with different ports
socket.connect("http://myapp.azurewebsites.net:1337/", this);
Это дает мне ошибку на клиенте:
Error while handshaking... Operation timed out
Логи на сервере:
debug: websocket writing 1::
debug: setting request GET /socket.io/1/websocket/SFePun_Ug5ycS5EVIrSO
debug: set heartbeat interval for client SFePun_Ug5ycS5EVIrSO
debug: discarding transport
debug: cleared heartbeat interval for client SFePun_Ug5ycS5EVIrSO
debug: setting request GET /socket.io/1/websocket/SFePun_Ug5ycS5EVIrSO
debug: set heartbeat interval for client SFePun_Ug5ycS5EVIrSO
debug: discarding transport
debug: cleared heartbeat interval for client SFePun_Ug5ycS5EVIrSO
debug: setting request GET /socket.io/1/websocket/SFePun_Ug5ycS5EVIrSO
debug: set heartbeat interval for client SFePun_Ug5ycS5EVIrSO
debug: discarding transport
(repeated a couple of times)
...
IIS Detailed Error - 503.13 - Number of active WebSocket requests has reached the maximum concurrent WebSocket requests allowed.
socket.connect("http://myapp.azurewebsites.net/", this);
Что не должно случиться, если я подключу одного клиента.
Любые идеи, как это исправить?
РЕДАКТИРОВАТЬ: Попытка перейти от транспортного веб-сокета на xhr-опрос. Это не дает мне ошибку HTTP 503.13 и устанавливает соединение с сервером, но работает плохо.
2 ответа
Как я знаю, вам нужно включить Web sockets
параметры на вкладке Application settings
на портале Azure или настройте web.config
файл для добавления контента <webSocket enabled="true" />
если вы хотите использовать функцию веб-сокета.
В качестве ссылки, пожалуйста, смотрите ниже.
Рисунок 1. Включите Web sockets
на портале Azure
Ссылаясь на вики-страницу Используя пользовательский web.config для приложений Node, функция веб-сокета по умолчанию отключена.
Как сказал @ArneRie, веб-приложения Azure прослушивают только порты 80 и 443, см. https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox.
Информацию о лимитах веб-сокетов на экземпляр службы приложения для другого уровня см. На https://azure.microsoft.com/en-us/documentation/articles/azure-subscription-service-limits/.
Поэтому я думаю, что первым шагом является то, что убедитесь, что функция websocket включена, а затем попытайтесь установить соединение websocket с протоколом http и портом 80 через socket.io-java-client.
Надеюсь, поможет. Любая проблема, пожалуйста, не стесняйтесь, дайте мне знать.
Azure всегда отображает порт 80/443 для ваших приложений Node.JS.
var port = process.env.PORT || 1337;
Ваше приложение прослушивает порт 80/443 с этим фрагментом кода.
Я не знаю, на каком хостинг-плане вы работаете, но когда у вас есть уровень Free, соединения очень ограничены (5?).
Возможно, вы работаете с этой ошибкой, когда TCP-соединения не закрываются после истечения времени ожидания: Node.js - Socket.io - проблема с "максимальным количеством одновременных соединений"