2013-08-18 83 views
1

我正在上的AWS EC2實例+的NodeJS快遞+ socket.io + httpd的應用。延遲socket.io響應,並 「警告 - WebSocket連接無效」

在加載該頁面時,記錄儀提供了這樣的信息:

GET/200 2ms - 1.23kb 
GET /javascripts/script.js 304 1ms 
    debug - served static content /socket.io.js 
GET /stylesheets/style.css 304 1ms 
GET /stylesheets/style.css 304 1ms 
GET /images/052.png 304 1ms 
GET /Candara.ttf 304 1ms 
    debug - client authorized 
    info - handshake authorized EgWLPeyO2uiCTSui01CP 
    debug - setting request GET /socket.io/1/websocket/EgWLPeyO2uiCTSui01CP 
    debug - set heartbeat interval for client EgWLPeyO2uiCTSui01CP 
    warn - websocket connection invalid 
    info - transport end (undefined) 
    debug - set close timeout for client EgWLPeyO2uiCTSui01CP 
    debug - cleared close timeout for client EgWLPeyO2uiCTSui01CP 
    debug - cleared heartbeat interval for client EgWLPeyO2uiCTSui01CP 

在這一點上,事情會暫停約5秒鐘,之後:

debug - setting request GET /socket.io/1/xhr-polling/EgWLPeyO2uiCTSui01CP?t=1376937523124 
    debug - setting poll timeout 
    debug - client authorized for 
    debug - clearing poll timeout 
    debug - xhr-polling writing 1:: 
    debug - set close timeout for client EgWLPeyO2uiCTSui01CP 
    debug - setting request GET /socket.io/1/xhr-polling/EgWLPeyO2uiCTSui01CP?t=1376937523490 
    debug - setting poll timeout 
    debug - discarding transport 
    debug - cleared close timeout for client EgWLPeyO2uiCTSui01CP 

這點之後,事情開始據我可以告訴運轉良好,事件被觸發,無延遲接收(如果事件被觸發之前話,5秒上述延誤,他們將不會被處理,直到延時完成後)。問題是如何消除5秒的延遲。

客戶端JS是這樣的:

window.onload = function() { 
    var socket = io.connect("http://xxx.us-west-2.compute.amazonaws.com", {resource: "/socket.io"}); 

服務器端JS是這樣的:

var express = require('express'); 
var app = express(); 
var io = require("socket.io").listen(app.listen(3000)); 

我的httpd.conf文件看起來是這樣的:

ProxyPreserveHost On 
ProxyPass/http://localhost:3000/ 
ProxyPassReverse/http://localhost:3000/ 

<Proxy *> 
    Order deny,allow 
    Allow from all 
</Proxy> 

<Location /> 
    allow from all 
</Location> 

如何避免初始延遲並建立與socket.io的健康連接?

+0

的問題很可能在您的代理。您正在運行的版本是否全面支持websockets? – dc5

+0

我只是運行Apache/2.2.25。你的意思是我需要對Apache做些什麼? – WindChimes

+1

可能 - 是的。對websockets的支持可能會或可能不會在該版本中(我不確定),或者你只需​​要調整配置。從你的問題的描述來看,這聽起來像socket.io正在回落到長輪詢。如果您還沒有這樣做,請將socket.io置於詳細調試模式 - 它會告訴您它正在嘗試哪些協議。 – dc5

回答

5

我通過將允許的傳輸方法限制爲「xhr-polling」和「jsonp-polling」來解決了這個問題。我相信這是因爲Apache/2.2.25不支持其他。

加入相關的代碼服務器端:

io.set("transports", ["xhr-polling", "jsonp-polling"]); 
+4

我只是評論,當我看到這張貼:)。這會起作用,但是你會失去websockets的好處。您還需要確保,如果/當您開始運行多個服務器時,您的負載均衡器配置爲粘性會話或持久會話(redis.io或其他),因此請求可以在任何服務器上進行。 – dc5