2010-08-09 80 views
6

我知道在Java中,當你想創建一個高性能的服務器時,你使用nio而不是常規套接字。 對於C#來說,創建高性能服務器有沒有這樣的事情?C#==>高性能服務器?

+1

我最近看到這個,你可能會覺得很有趣:http://developers.slashdot.org/story/10/07/27/1925209/Java-IO-Faster-Than-NIO – AaronLS 2010-08-09 17:04:29

+0

@AaronLS:它看起來像nio是一個異步套接字庫,而.NET的套接字可以同時工作。 – 2010-08-09 17:05:35

+2

無論語言如何,套接字類將在.NET中都是一樣的,所以我更改了標籤。 – 2010-08-09 17:05:58

回答

11

是,SocketAsyncEventArgs

SocketAsyncEventArgs類是一組增強的 System.Net.Sockets.Socket類的那 提供可由 專門高性能插座 一起使用的備選異步 模式的一部分 應用。這個類是 專門設計用於網絡 服務器應用程序,需要高的 性能。應用程序可以專門或僅在目標熱點 區域(例如,當接收到大量數據時)使用增強的異步模式 。

+3

嗯,這是沒有錯的,但它使得它聽起來好像這是所使用的一類特殊*,而不是常規*'Socket'的時候,其實它只是對某些類型的異步的事件類型調用'Socket' 。 – 2010-08-09 17:15:27

+2

使用SocketAsyncEventArgs進行編程絕對不是「只是某種異步調用的事件」。當開始一個項目時,它有明確的選擇:使用同步調用,使用經典異步(beginsend/callback/endsend)或使用SocketAsyncEvent。請參閱版本3.5中的套接字性能增強http://msdn.microsoft.com/en-us/library/bb968780.aspx – 2010-08-10 00:04:26

0

使用常規套接字有多種不同的方式。通常,異步使用可以更好地擴展

2

您可以使用異步套接字。如果那個不夠好,您可以隨時查看Network Direct SPI,這是HPC SDK的一部分。請注意,Network Direct確實需要特定於硬件的提供商。

+0

+1但是,沒有用於網絡直接管理的API,是嗎? – 2010-08-09 17:14:23

+0

這看起來很有趣,但硬件特定的要求讓我懷疑它是否是一個好主意。另一個有趣的,但也許不明智的選擇是隻使用P/Invoke。 – 2010-08-09 17:16:21

+0

謝謝,異步不會這樣做,我們正在談論超過5k客戶端連接到服務器,並保持連接,並與服務器通信。我將看看網絡直接SPI,謝謝 – aryaxt 2010-08-09 17:23:59

1

SocketAsyncEventArgs使用Windows I/O完成端口,這使得它更快。它是異步的,這使得它可以擴展。與SocketAsyncEventArgs真正的大交易是I/O完成端口。

有關如何使用SocketAsyncEventArgs,請參見http://www.codeproject.com/KB/cs/socketasynceventargs.aspx