我正在爲我的客戶端到服務器應用程序創建登錄服務器。服務器到客戶端的服務器身份驗證 - 單線程
基本上有5個服務器,並且所有這些服務器都連接到一個登錄服務器。
客戶端可以連接到這5臺服務器中的任何一臺,但需要使用用戶名和密碼進行認證。身份驗證應該在登錄服務器中完成,並且登錄服務器應該向實際的服務器返回應答,以便將答案返回給客戶端。
因此,它像:
客戶端 - >服務器 - >登錄服務器 - >服務器 - >客戶端(響應代碼)
現在,我使用的Netty和它的NIO,它不是thread-每個客戶端。現在,爲了與NIO進行身份驗證,我們必須等待來自登錄服務器的響應,這可能需要一段時間並延遲其他希望登錄的客戶端,實際上,您不能等待NIO的解答。所以我想到了一個想法,我該如何讓它工作。我的想法是在不同的線程上運行請求,並使用onResponse(String key, int responseCode)
方法處理事件,然後將客戶端的頻道放入帶有生成密鑰的地圖中,這樣我們就可以知道響應屬於哪個人。所以當我們進行身份驗證時,我們會發送密鑰和用戶數據。
但我覺得這是一個壞的方法,有一個更有效的方法來做到這一點。有任何想法嗎?
AFAIK netty支持使用每個連接的線程來阻塞NIO。請注意,NIO的* default *行爲是阻塞操作,直到最近只有Socket支持非阻塞操作作爲選項。 –
在多服務器環境中,使用地圖保留通道時會被破壞。 – eg04lt3r
只是一個建議,因爲你要求更好的方法來做到這一點 - 如果你使用Java,你可能需要查看websockets,例如html 5 + http(s)。然後,您爲每個客戶端模型獲得一個線程,使用加密進行身份驗證對您的應用程序是透明的,並且您可以獲得NIO的所有功能,而無需部署最終客戶端。 – MuffinMan