簡體   English   中英

如何與服務器同時處理多個請求

[英]How to Process Multiple Requests at the Same Time With a Server

好吧,這是我的想法:

如果同時向一台服務器發出兩個請求,一個請求將被拒絕,如果是這樣,您如何避免這種情況發生?

目前,我為正在創建的聊天應用程序設置了服務器,它基本上啟動了TCP / IP連接,等待客戶端,讀取從客戶端發送的數據,發回一些東西,斷開連接並重復。 這樣,服務器將永遠不會停止運行,並且可以發出任意數量的請求。

但是,如果客戶端正在啟動,而另一個程序正在使用服務器,該怎么辦。 如果一個程序從另一個服務器啟動時正在從服務器獲取文件,而啟動一個程序需要從服務器獲取數據,但是它已經很忙,那會發生什么?

啟動將等待服務器可用,還是直接出錯(因為沒有可用的連接)。 如果是這樣,這可能真的很糟糕,因為從那時起,用戶將不會擁有所有數據,例如他的朋友列表或一些聊天記錄。 您該如何解決?

我的想法是,您可以設置一個while循環,以便它一直使服務器排隊,直到獲得響應為止。 這是正確的方法嗎?

否,客戶端應假定服務器始終可用。 您將看到基本的Socket.Listen(int32)方法( TcpListener充當包裝器)采用一個參數backlog

監聽使面向連接的套接字監聽傳入的連接嘗試。 backlog參數指定可以排隊接受的入站連接數。 要確定您可以指定的最大連接數,請檢索MaxConnections值。 聽不阻塞。

大多數服務器實現都以以下內容開頭:

socket.Listen(10); // You choose the number
while (true)
{
    var client = socket.Accept();
    // Spawn a thread (or Task if you prefer), and have that do all the work for the client
    var thread = new Thread(() => DoStuff(client));
    thread.Start();
}

通過這種實現,總是有一個線程在監聽新的連接。 當客戶端連接時,會為其創建一個新線程,因此對該客戶端的處理不會延遲/阻止更多連接在主線程上被接受。

現在,如果以比服務器創建新線程快的速度引入了一些新連接,那么新連接將自動放入待辦事項列表中(我認為是在OS級別) backlog參數決定了在服務器中可以有多少未決連接。一次積壓。

如果待辦事項完全填滿怎么辦? 此時,您需要第二台服務器和一個負載平衡器來充當中間人,將一半的請求定向到第一台服務器,將一半的請求定向到第二台服務器。

這里的邏輯很簡單。

  1. 服務器開始偵聽並開始接受客戶端。

  2. 客戶端嘗試連接到服務器。 如果服務器未運行,則可以不執行任何操作,或者可以實現一些重新連接邏輯,以通知客戶端有關連接嘗試失敗的信息。

  3. 假設客戶端嘗試連接時服務器正在運行。 您正在談論多客戶端應用程序。 您不應該斷開客戶端連接。 您應該將連接的客戶端添加到連接的客戶端列表中。

  4. 然后,當某些客戶端連接到服務器時,還有其他一些已經連接的客戶端並發送一些消息。 您通過客戶端套接字接收到該消息,然后將該消息廣播給所有其他已連接的客戶端(發送數據的客戶端除外)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM