2016-05-13 99 views
0

我有一個socket.io v0.9.17節點js應用程序部署在azure上(我已用兩個客戶端本地測試過,它工作正常),代碼如下:問題連接到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-polling。這不會給我HTTP 503.13錯誤,並建立到服務器的連接,但它效果不佳。

回答

0

Azure將您的Node.JS應用程序始終映射到端口80/443。

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

您的應用正在使用這段代碼偵聽端口80/443。

我不知道你正在運行什麼樣的主機計劃,但是當你有免費層時,連接是非常有限的(5?)。

可能是你在這個bug下運行,同時超時後不關閉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

正如我知道的,您需要啓用該選項卡Application settings在Azure門戶Web sockets選項或配置web.config文件如果您要使用websocket功能,請添加內容<webSocket enabled="true" />

作爲參考,請參閱下文。

圖1.啓用Azure的門戶 enter image description here

Web sockets指的Using a custom web.config for Node apps wiki頁面,WebSocket的功能是默認情況下禁用。

正如@ArneRie所說,Azure webapp只能監聽端口80 & 443,請參閱https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#network-endpoint-listening

而對於不同層次的每個應用服務實例的websockets限制,請參閱https://azure.microsoft.com/en-us/documentation/articles/azure-subscription-service-limits/#app-service-limits

enter image description here enter image description here

所以我認爲第一步是要確保啓用WebSocket的功能,然後嘗試建立與通過socket.io-Java的客戶端的HTTP協議和端口80的WebSocket連接。

希望它有幫助。任何問題,請隨時讓我知道。

+0

我已經完成了上述所有工作,並且我有標準計劃。端口似乎是80,當我使用process.env.PORT,我仍然得到http 503.13錯誤。 – codingIsFun

+0

@codingIsFun請參考[博客]的「Node.js基本聊天示例」部分(https://azure.microsoft.com/en-us/blog/introduction-to-websockets-on-windows-azure-網站/),並嘗試爲客戶端使用「https」協議。 –