2012-04-17 166 views
2

我有Chat Client Server應用程序,我們正在擴展。所以我需要在兩臺聊天服務器之間進行服務器間通信。通過Java套接字的InterServer通信

問題是:假設有兩個服務器A和B現在假設客戶 C1被TCP連接與服務器A和與 服務器B. 客戶端C2被連接TCP然後問題是:作爲同一器件的應用客戶端C1和C2應該能夠相互識別爲已登錄並可在線使用,但由於沒有內部服務器 通信,因此不會發生這種情況。

可能的解決方案否1是:使用TCP連接將服務器A和服務器B登錄到每個其他 。在這裏,我可以通過 TCP連接將登錄XML 消息(字符串)和DataInputStream轉發到其他服務器。所以每個登錄都被轉移到另一臺服務器上,以便每臺服務器都可以訪問每個客戶端,客戶端C1可以看到 客戶端C2已登錄(在線),反之亦然。

解決方案1的問題是:假設客戶端C1現在可以看到Client C2爲 ,並且客戶端C1向客戶端C2發送消息。 會發生什麼是服務器A將嘗試寫入DatainputStream爲客戶端 C2它建立在服務器B上,而不是在服務器A上。這裏是 問題的代碼將在這裏打破,服務器A將無法發送 消息給客戶端C2。

任何輸入將不勝感激。

謝謝

+0

爲什麼您需要擴展到多臺機器?我們在談論多少用戶?您是否已經使用了非阻塞IO或者仍然使用每個連接的一個線程?如果可能的話,避免在多臺機器上擴展 - 這是一個(有狀態)的痛苦世界。 – 2012-04-17 07:39:21

+0

謝謝reply.Well我的客戶希望確保如果他會得到更多的打擊他的產品,他應該能夠擴大規模。我們討論了基準測試和除了新產品以外的所有產品,他無法計算可能的命中數。所以我必須實施服務器間通信,無論如何,正如我上面所解釋的。該產品已經在使用每個連接使用Thread.am思考非阻塞套接字,它的即將到來。所以在你的想法中的任何可能的解決方案呢? – Java 2012-04-17 08:08:28

回答

3

你可以看看IRC服務器如何實現這樣的功能。我相信你只需要編寫另一個服務器來處理你的服務器作爲客戶端,並向他們請求以找到具體的用戶。

http://tools.ietf.org/html/rfc2810

+1

謝謝re3ply @AlexTheo。你能爲你的答案建議有用的鏈接嗎? – Java 2012-04-17 12:33:24

+0

我看到實際上IRC服務器在內部實現(服務器服務器),因此如果您需要遵循irc的方式,您需要在內部爲服務器實現服務器。 http://tools.ietf.org/html/rfc2810 – AlexTheo 2012-04-18 09:27:17

+0

否則只是實現另一個服務器(服務器服務器)(分開),在我看來這是更靈活的解決方案。 – AlexTheo 2012-04-18 09:28:32