2017-06-18 37 views
1

我有一個聊天系統,其中socketio客戶端在成功連接後向節點服務器發送一個id。因此,當用戶使用應用程序時,他們始終連接到節點服務器,但當應用程序關閉時,連接也會關閉。所以我想要的是保持客戶端連接到服務器,即使應用程序沒有運行。我正在使用Webview的應用程序。即使未運行應用程序時仍保持socketio和nodejs連接

問題:如何使用socketio連接到節點服務器,並在應用程序未運行時使用javascript發送一些數據?

謝謝。

回答

0

在節點中構建端點以生成客戶端ID,並且客戶端連接時向您發送自己的ID,並將socketio ID與您自己的ID相關聯。然後在實體中引用您自己的ID。在任何情況下,使用庫的ID作爲你自己的將會是一種痛苦,這樣當客戶端重新連接時,它可以提供你自定義發給他們的ID,並選擇它離開的地方。這使得重新連接成功,意味着你不必爲這個問題設計構造。

我說這一切,因爲它將很難保持100%的正常運行時間,連接永遠不會關閉。如此。如果android應用程序重新啓動,那麼如果您依賴由socketio提供的這些臨時ID,則所有狀態都將被重置。如果後端重新啓動,任何代理故障等,然後你會回到原點。這就是說,我會建立兩個節點服務器 - 一個套接字服務器,它除了接受連接和轉發數據外什麼都不做,還有一個服務器可以整天重新啓動,它負責調用第一個服務器發送數據。

如果你想擴展這個,你可能會有很多很多的套接字服務器,讓它們綁定到一個排隊系統,比如rabbitmq,並且當它們獲得事件時爲它們有連接的客戶端訂閱事件他們可以將它們寫入套接字。然後讓您的其他控制服務將事件發佈到排隊系統,以便將事件發送到套接字。通過這種方式,您可以將業務邏輯的重新部署與維護與Android客戶端的連接的服務器徹底解耦。

另一種解決方案可能是使用諸如https://www.pubnub.com/之類的東西,它將爲您解決大部分這些問題。

祝你好運。

+0

感謝您的回答,您在這方面是對的,但我很抱歉,我真的搞砸了這個問題。我想知道的比我問的要簡單得多。客戶端發送給服務器的id對於該用戶是固定的或靜態的,所以這不是問題。問題是,當應用程序關閉或重新啓動時,從服務器上刪除了該標識,因此服務器不知道該客戶端。所以我想知道的是如何在應用程序未使用socketio運行時在後臺再次連接到服務器(並最終發送相同的ID)。 – atx

+0

@atx,你想要android應用程序保持連接,即使它在後臺?根據我的理解,你可能能夠在這裏或那裏得到一些時間,在那裏你可以重新連接並汲取一些事件,但是你將無法一天24小時保持活力。我會研究可用於活動的生命週期掛鉤,當它暫停並恢復時。 – Catalyst

+0

當活動/應用程序暫停並恢復時,連接全部正常,當用戶關閉應用程序時發生問題。我想調用一個連接到服務器的js函數'var socket = io('0.0.0.0:8000')',使用在後臺運行的Android服務將執行這個技巧(但不確定)。你認爲什麼,催化劑? – atx

相關問題