2014-12-20 114 views
1

我正在開發使用c#的聊天應用程序。我已經完成了服務器和客戶端之間進行通信所需的一切,但是我不確定該怎麼做才能使客戶端能夠相互通信。客戶端與客戶端的通信在與很多客戶端的套接字編程中

我在互聯網上搜索了很多。我以前實際上詢問過幾乎相同的問題。

Client to client messaging in socket programming

現在我知道有兩個接近的工作要做。

第一個是客戶端到客戶端的直接通信,其中一個客戶端充當另一個客戶端的服務器,但由於系統防火牆可能阻止客戶端充當服務器,所以它有一些缺點。

第二種方法是讓服務器通過接收來自其中一個客戶端的消息並將其發送給另一個客戶端來進行通信。我個人更喜歡這一個,因爲我認爲它必須更可靠,我們可以絕對確定該消息將被髮送和接收。如果我錯了,請讓我知道。

但是,我的問題是,我不知道客戶端應該如何讓服務器知道他想與之通信的另一個客戶端。 更具體地說,假設客戶端A想要與客戶端B通話。所以他使用用戶名或客戶端B的IP地址將他的請求發送到服務器。現在,服務器應該如何找到客戶端B?它是否必須保留客戶列表並使用for語句搜索客戶端B?如果有數百或數千甚至數十萬個客戶端連接到服務器會怎麼樣?

如果我沒有清楚解釋我的問題,請讓我知道。任何幫助表示感謝。

+1

你似乎在你的問題的所有答案的消息,將消息發送到(客戶端B),共同提高。你正確地關注需求。你必須跟蹤每個客戶。如果服務器有成千上萬的連接,你應該開始尋找某種負載平衡。 – itsme86

+0

雖然問題很廣,但非常真實和正確。它解決了任何人都可以面對的問題,再加上他以非常精確的方式提出了問題,我不知道爲什麼此線程關閉以便進一步討論。 –

+0

我認爲這個線程一定是打開的。我偶然找到了一個類似的解決方案,但我也可以爲這個特定問題提供一個有用的答案。如果討論是開放的,這可能會有很多建設性的幫助。 –

回答

1

在這種情況下,服務器必須保留連接到它的客戶端的列表。下面是它如何工作:

  1. 客戶端A連接到服務器
  2. 服務器發送客戶端的客戶名單,供他
  3. 客戶端A發送服務器的名稱(或ID)的客戶端吧希望與
  4. 服務器發送客戶端B消息
+0

我想你的答案更相關。當然,服務器應該發送連接到它的客戶端列表並且可以提供給客戶端A.例如當前在客戶端A所在的聊天室中的客戶端。讓我知道,如果我有你的想法正確。 – user3530012

+0

是的你是對的。 – Phoenix

+0

更可行的方法是實現一種機制,在該機制中,客戶端連接後向服務器註冊其服務。然後,當任何客戶端需要一個服務時,它可以只是將一個服務請求傳遞給服務器(具有所需的參數等),服務器可以將請求路由到服務客戶端,並將響應發回給請求客戶端。這消除了每個客戶都需要了解所有其他連接的客戶端以及每個客戶願意提供的服務的需求。不幸的是,這個線程已關閉,否則這將是一個更詳細的答案。 –

2

帶有一箇中央服務器的解決方案聽起來正確。作爲一個普遍的想法 - 服務器應該保存連接到它的所有客戶端的列表。然後,當客戶端A想要向客戶端B發送消息時,它會向服務器發送一條消息,指定消息應該到達哪個客戶端。