2012-12-17 76 views
1

我正在設置一個類似網頁的股票代碼,用JavaScript編寫。我也用C++編寫頁面與之對話的服務器。我可以繼續將數據從服務器推送到同一連接嗎?

我希望使網頁高效,這樣它就可以嚮應用程序服務器發送單一訂閱消息,然後持續打開保持連接,不斷接收從應用程序服務器推送的入站數據。

目前,我每次從服務器收到數據時都必須重新發出Web客戶端的訂閱呼叫。問題是每次XHR對象命中readyState(4)時,調用都會有效完成。在此之後到達網頁的任何數據都將被忽略。 Web客戶端可以重新發送數據並重置對象,但發送不必要,並且僅用於重置XHR對象。

我想知道是否有可能以某種方式重置現有的XHR對象,並將其置於期望更多入站數據的狀態,以便當更多數據被推送到網頁時,網頁響應並處理它。

在此先感謝您提供的任何幫助。注意:在這個項目中不使用JQuery。

+1

不適用於XHR(實際上,不適用於HTTP)。你正在尋找[Websockets](https://developer.mozilla.org/en-US/docs/WebSockets)。 – bfavaretto

+0

@bfavaretto,這應該是一個答案,而不是一個評論。 :) – epascarello

+0

@epascarello有時候我太懶惰了! :)添加了一些更好的答案。 – bfavaretto

回答

1

我強烈建議尋找Websockets,尤其是像socket.io這樣的庫,它將各種瀏覽器的Websocket傳輸實現封裝到單個API(WS,JSON,JSONP,Flash和長輪詢)中。

現在所有主流瀏覽器都支持Socket.io客戶端庫。你唯一的挑戰可能是定位一個C++特定的服務器實現。希望this SO問題可能有一些幫助

否則,你唯一的選擇是在客戶端的長輪詢或彗星與合適的服務器端實現,可以擴展(即像NginX這樣的事件驅動服務器,而不是到每個連接線程的體系結構)。

我確實很感謝你致力於C++,但我的卑微建議是儘可能調查Node.js,並且提供非常高效的解決方案。

HTH和所有最好的。

+0

同意,網絡套接字是未來,我有意識地避免它,因爲它在舊版瀏覽器中缺乏支持。我很欣賞這種迴應,我將不得不繼續尋找其他一些方法來使長輪詢更有效。乾杯。 –

1

HTTP是一次性協議:一個請求,一個響應,你就完成了。如果你想保持連接打開,你可以使用Websockets(MDN reference pageclient-side code example)。但是,考慮到它在舊版瀏覽器(IE,例如,剛剛開始支持版本10的Websockets)時將不被支持,因此您可能需要使用XHR和long-polling來實現回退。

+0

我在某處讀到XHR可以通過讓瀏覽器認爲一個大文件以塊傳遞的方式被固定爲流式傳輸,但我找不到一個示例。 WebSockets是理想的,但至少今年我需要向後支持。謝謝你的幫助。 –

相關問題