.net / C#中的网络

有人可以指点我学习如何在C#/ .net 3.5中进行网络连接吗? 欢迎提供代码示例和解释。 基本上我正在寻找如何做异步/multithreading服务器/客户端模型。

我对使用WinSock在C ++中完成此操作的基础知识非常满意,但我的所有研究似乎都无法在C#中掌握这一概念。

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

如果WCF满足您的需求,那值得关注。 存在ZeroC和其他替代更高级别的库。 否则,有几种不同的方法可以更接近套接字级别,如果这是你需要的。

的TcpClient / UdpClient

这些在底层sockets周围提供了相对薄的包装。 它本质上提供了套接字上的Stream。 您可以在NetworkStream上使用异步方法(BeginRead等)。 我不喜欢这个,因为包装器没有提供那么多,它往往比直接使用套接字更加尴尬。

套接字 – 选择

这提供了用于将多个套接字IO多路复用到单个线程上的经典Select技术。 不推荐了。

sockets – APM风格

套接字的异步编程模型(AKA IAsyncResult,Begin / End Style)是异步使用套接字的主要技术。 并且有几种变体。 实质上,您调用异步方法(例如,BeginReceive)并执行以下操作之一:

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

最好的方法是#3,因为它通常是最方便的。 如有疑问,请使用此方法。

一些链接:

  • 关于套接字的MSDN杂志文章
  • 关于异步编程模型的Jeffery Richter文章

.NET 3.5高性能套接字

.NET 3.5为使用事件的异步套接字引入了一个新模型。 它使用“简化”异步模型(例如,Socket.SendAsync)。 您没有给回调,而是订阅了一个完成事件而不是IAsyncResult,而是获得了SocketAsyncEventArgs。 我们的想法是您可以重用SocketAsyncEventArgs并为套接字IO预分配内存。 在高性能场景中,使用APM样式可以更加高效。 此外,如果您预先分配内存,您将获得稳定的内存占用,减少垃圾收集,固定内存漏洞等。请注意,担心这一点只应考虑最高性能方案。

  • MSDN Magazine:与.NET Framework 3.5连接
  • MSDN信息,具有预分配内存的技术

摘要

对于大多数情况,请使用APM样式的回调方法,除非您更喜欢SocketAsyncEventArgs / Async方法的样式。 如果您在WinSock中使用了CompletionPorts,您应该知道这两种方法都使用了CompletionPorts。

在.NET 3.5世界中,您一定要学习Windows Communication Foundation – 用于网络的.NET框架。

有用的链接:

同步和异步操作(在WCF中)

您可以在标有WCF标记的StackOverflow浏览post上找到有用的WCF信息

这取决于你想要关注的内容。

如果您想专注于function并将管道保留在框架中,请从Windows Communication Foundation开始。

如果您正在构建自己的管道,请使用System.Net.Sockets.Socket类。