2016-05-13 3 views
0

У меня есть приложение socket.io v0.9.17 с узлом js, развернутое на лазури (которое я тестировал локально с двумя клиентами, и он отлично работает) со следующим кодом:Проблема с подключением к socket.io azure webapp

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-клиент с:

// 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); 

Этого не должно быть, если я подключу одного клиента.

Любые идеи, как исправить это?

РЕДАКТИРОВАТЬ: Пытался перейти с транспортного websocket на xhr-опрос. Это не дает мне ошибку HTTP 503.13 и устанавливает соединение с сервером, но работает плохо.

ответ

0

Карты Azure всегда к порту 80/443 для ваших приложений Node.JS.

var port = process.env.PORT || 1337; 

Ваше приложение прослушивает порт 80/443 с помощью этого фрагмента кода.

Я не знаю, на каком хостинговом плане вы работаете, но когда у вас есть Свободный уровень, соединения очень ограничены (5?).

Может быть, вы работаете в этой ошибке, с TCP подключений не закрыт после тайм-аута: Node.js - Socket.io - Issue with "maximum concurrent connections"

+0

У меня есть план стандартного хостинга, поэтому он должен работать для одного клиента. 80 дает мне те же ошибки, что и другие порты. 443 дает мне сброс подключения исключения. Однако ни одна из них не работает на местном уровне. В нем говорится: предупреждение - ошибка: Ошибка: прослушать EACCES 0.0.0.0:443 – codingIsFun

+0

см. Обновленный ответ – opHASnoNAME

+0

Я тоже видел это сообщение, но ошибка возникает только с одним подключенным клиентом, а стандартный план должен давать неограниченное или 350 одновременных подключений , – codingIsFun

2

Как я знал, что вам нужно включить Web sockets опции в закладке Application settings на Лазурном портале или настроить файл web.config для добавив контент <webSocket enabled="true" />, если вы хотите использовать функцию websocket.

Как ссылка, см. Ниже.

Рисунок 1. Включение Web sockets на Лазурном портала enter image description here

Отсносящийся на странице вики Using a custom web.config for Node apps, функция WebSocket по умолчанию отключена.

Как @ArneRie сказал, Azure webapps прослушивает только порты 80 & 443, см. https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#network-endpoint-listening.

И за пределы веб-портов на экземпляр службы приложений для разных уровней, см. https://azure.microsoft.com/en-us/documentation/articles/azure-subscription-service-limits/#app-service-limits.

enter image description here enter image description here

Так что я думаю, что первый шаг состоит в том, что убедитесь, что включена функция WebSocket, а затем попытаться установить соединение WebSocket с протоколом HTTP и портом 80 через Socket.io-Java-клиент.

Надеюсь, это поможет. Любое беспокойство, пожалуйста, не стесняйтесь, дайте мне знать.

+0

Я на самом деле все это сделал, и у меня стандартный план. Порт, кажется, 80, когда я использую process.env.PORT, и я все еще получаю ошибку http 503.13. – codingIsFun

+0

@codingIsFun См. Раздел «Пример основного чата Node.js» в [blog] (https://azure.microsoft.com/en-us/blog/introduction-to-websockets-on-windows-azure- веб-сайты /) и попытаться использовать протокол «https» для клиента. –