2017-01-02 60 views
0

我正在使用庫(ShareDB)進行操作轉換,並且服務器和客戶端使用websocket-json-stream進行通信。然而,這個ShareDB是作爲一個服務在nodejs上運行的(我使用zerorpc來控制我的節點進程),因爲我的主要web框架是Tornado(python)。我從這個thread瞭解到,使用TCP等有狀態協議時,客戶端端口的連接是不同的(因此只需要一個服務器端口)。根據這個response regarding how websockets handle multiple incoming requests,tcp和websockets之間的底層傳輸通道沒有區別。所以我的問題是,如果我從客戶端創建一個websocket到python服務器,然後也從客戶端到我的nodejs代碼(ShareDB服務)如何區分哪個套接字與哪個套接字?服務器的責任是在給定的時間只有一個套接字「監聽」連接(即先建立與Python服務器的通信,然後開始監聽第二個websocket?)區分多個Websocket

+0

我不能完全遵循什麼是連接到什麼。你用「服務器」和「客戶端」這個術語來描述你的意思。聽起來你有兩臺服務器(一臺python服務器和一臺nodejs服務器)和一臺客戶機。所以,我會假設客戶端連接到您的兩臺獨立服務器中的每一臺。但是,然後你問服務器如何區分,但每個服務器應該只有一個連接到給定的客戶端?對你想要做的事感到困惑。僅供參考,您通常會使用與使用Cookie識別傳入http連接的相同方式識別傳入webSocket連接。 – jfriend00

+0

如果您要從客戶端連接到同一物理服務器計算機上的每個單獨服務器,則每個服務器進程都將監聽另一個端口,並且客戶端將連接到相應的端口以確定它是哪個服務器連接到。 – jfriend00

+0

謝謝,我認爲你總結得比我更好,所以我會編輯措辭。兩臺服務器都在同一個物理系統上......我使用Heroku,據我所知它們只允許單個端口打開。 – Flaminator

回答

1

運行最簡單的方法同一個物理服務器上的兩個服務器進程是讓它們中的每一個在不同的端口上偵聽,然後客戶端連接到該服務器上的相應端口,以指示它嘗試連接到哪個服務器。

如果你的服務器環境只能有一個入站端口,那麼你可以使用類似代理的東西。您仍然有兩臺服務器在不同的端口上偵聽,但是沒有人在偵聽對外開放的端口。代理偵聽對外部開放的一個傳入端口,然後根據傳入連接的某些特徵,代理將該傳入連接指向適當的服務器進程。

代理可以配置爲識別您嘗試通過URL或DNS主機名連接的進程。