在.NET/C#中的网络编程

3

请问有人能指导我如何在C#/.net 3.5中学习网络编程吗?欢迎提供代码示例和解释。基本上,我正在寻找如何实现异步/多线程的服务器/客户端模型。

我对如何在C++中使用WinSock完成这项任务比较熟悉,但是尽管进行了大量的研究,仍然无法掌握C#中的这个概念。

非常感谢您能提供的任何帮助 :)

3个回答

16
如果WCF符合你的需求,那值得一看。ZeroC 和其他替代的更高层次的库也存在。否则,如果需要更接近套接字级别的工作,有几种不同的方法。

TcpClient/UdpClient

它们提供了相对较薄的套接字包装器。它在套接字上提供了一种流。您可以在NetworkStream上使用异步方法(BeginRead等)。我不喜欢这个,因为包装器的作用不大,并且使用它比直接使用套接字更麻烦。

Socket - Select

这提供了经典的Select技术,以将多个套接字IO复用到单个线程中。不再推荐使用。

Socket - APM样式

套接字的异步编程模型(又称IAsyncResult、Begin/End样式)是使用套接字进行异步操作的主要技术。而且有几个变体。基本上,您调用一个异步方法(例如,BeginReceive),并执行以下操作之一:

  1. 在返回的IAsyncResult上轮询完成(几乎不使用)。
  2. 使用IAsyncResult的WaitHandle等待方法完成。
  3. 将BeginXXX方法传递给回调方法,在方法完成时执行该方法。

最好的方法是#3,因为它通常是最方便的。如果不确定,请使用此方法。

一些链接:

.NET 3.5高性能套接字

.NET 3.5引入了一种使用事件的新型异步套接字模型。它使用“简化”的异步模型(例如Socket.SendAsync)。您不需要提供回调函数,而是订阅完成事件;您也不需要使用IAsyncResult,而是使用SocketAsyncEventArgs。其思想是可以重用SocketAsyncEventArgs,并为套接字IO预分配内存。在高性能场景下,这比使用APM风格更有效率。此外,如果预分配内存,则可以获得稳定的内存占用、减少垃圾收集、避免由固定引起的内存空洞等优点。请注意,只有在最高性能的情况下才需要考虑这些问题。

总结

对于大多数情况,请使用APM风格的回调方法,除非您更喜欢SocketAsyncEventArgs / Async方法的风格。如果您曾经在WinSock中使用过CompletionPorts,则应该知道这两种方法都在底层使用CompletionPorts。


2

0

这取决于你想要关注什么。

如果你想专注于功能,把底层工作交给框架处理,那么可以从Windows Communication Foundation开始。

如果你想自己构建底层工作,那么可以使用System.Net.Sockets.Socket类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接