2010-08-09 65 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