2013-04-10 32 views
-1

我正在使用德爾福 我有一個設備。 設備有以太網卡。我給一個IP地址和端口設備(服務器IP地址)。 設備每秒向服務器發送帶有tcp/ip的數據。如何聽1200設備

我必須從Server.I監聽設備有1200個設備 從一臺服務器監聽1200設備的最佳方法是什麼? (多線程或其他方式)

+2

我想一個簡單的循環可以很容易地處理1,200個連接,但它取決於你對數據做什麼,即線程收到每個數據包後做了多少工作。用我想的單線程來實現會很簡單,如果需要的話稍後再升級到線程池。如果Delphi支持(我不知道)並且讓它擔心調度和哪些線程涉及,但它可以更靈活地自己管理它,另一種方法可能是使用帶有回調的異步套接字。 – Rup 2013-04-10 11:32:47

+1

我認爲真正的問題是:你有什麼嘗試? **和**服務器每次連接需要做多少工作? – ComputerSaysNo 2013-04-10 11:37:33

+0

1200個線程接近Windows限制。你應該可以監聽來自1-4個線程的1200個連接,一些基於actor模式的庫或者異步事件或者I/O完成端口。也許它不一定是德爾福,只是一些中間服務器接收數據包,並通過一些IPC,如命名管道發送到您的服務器 – 2013-04-10 12:06:23

回答

2

退房ICS這是一個互聯網庫,它允許您管理單個線程的多個連接。適合您的目的。

+0

iirc ICS使用所有連接的主要Windows消息循環,這可能是一個瓶頸 – mjn 2013-04-10 18:18:25

+0

@mjn您可以在一個線程中使用它,所以我認爲它也可以在其中進行消息傳遞。當然值得檢查,如果這是一個問題(我知道它處理事情很好,我的情況在一個線程內)。 – mj2008 2013-04-11 11:48:03

3

這裏需要事件驅動的服務器。

忘掉Indy,並使用事件驅動(也稱爲I/O完成)IP服務器。

由於每個線程都保留2 MB的堆棧空間AFAIR,所以Windows限制大約爲2000個線程,32位。像Indy這樣的服務器每個連接都會使用一個線程,所以這隻會浪費大量資源。

通過設計,I/O completion可以平衡所有傳入請求到一個小線程池。看到Is there a I/O completion port based component for Delphi?Scalable Delphi TCP server implementation

+0

我相信Indy 10聲稱可以用於> 1K傳入連接的情況,但是+1,因爲我知道你是根據經驗說話的。不過我希望雷米會說indy 10個服務器可以編碼接受> 1.5K的客戶端。 – 2013-04-10 14:09:53

+2

@WarrenP Indy的I/O完成是否完成?沒有它,它將依賴每個連接的一個線程,恐怕這個功能還沒有實現。聽起來非常接近着名的[DataSnap綜合徵](http://robertocschneiders.wordpress.com/2012/11/22)... – 2013-04-10 14:27:01

+0

是的,我猜這不是。感謝您的博客文章鏈接,我沒有讀過。重要報價: *顯然,HTTP通信框架的結構使用Indy組件,它爲每個HTTP請求創建一個線程。這種行爲導致服務器每秒創建並銷燬數十個線程,這會導致巨大的開銷。這種開銷肯定是框架性能不佳的原因。很難說哪個是造成服務器崩潰的原因,但我相信它有一個聯繫。* – 2013-04-10 14:36:38