有人可以为我指明学习如何在 C#/.net 3.5 中进行网络连接的正确方向吗?欢迎提供代码示例和解释。基本上我正在寻找如何进行异步/多线程服务器/客户端模型。
我对如何使用 WinSock 在 C++ 中实现这一点的基础知识相当满意,但尽管我所有的研究似乎都无法掌握 C# 中的这个概念。
感谢您提供的任何帮助:)
如果WCF满足你的需求,那么值得一看。ZeroC http://www.zeroc.com和其他替代的更高级别的库存在。否则,如果您需要的话,有几种不同的方法可以更接近套接字级别。
TCP客户端/UDP客户端
它们在底层套接字周围提供了一个相对较薄的包装。它本质上是通过套接字提供一个流。您可以在 NetworkStream 上使用异步方法(BeginRead 等)。我不喜欢这个,因为包装器不能提供那么多,而且它往往比直接使用套接字更尴尬。
插座 - 选择
这提供了经典的 Select 技术,用于将多个套接字 IO 复用到单个线程上。不再推荐了。
插座 - APM 型
套接字的异步编程模型(又名 IAsyncResult,开始/结束样式)是异步使用套接字的主要技术。并且有几种变体。本质上,您调用异步方法(例如 BeginReceive)并执行以下操作之一:
- 轮询返回的 IAsyncResult 是否完成(几乎不使用)。
- 使用 IAsyncResult 中的 WaitHandle 等待方法完成。
- 向 BeginXXX 方法传递一个回调方法,该方法将在该方法完成时执行。
最好的方法是#3,因为它通常是最方便的。如有疑问,请使用此方法。
一些链接:
- MSDN 杂志上有关套接字的文章 http://msdn.microsoft.com/en-us/magazine/cc300760.aspx
- Jeffery Richter 关于异步编程模型的文章 http://msdn.microsoft.com/en-us/magazine/cc163467.aspx
.NET 3.5 高性能套接字
.NET 3.5 引入了一种使用事件的异步套接字的新模型。它使用“简化的”异步模型(例如 Socket.SendAsync)。您无需提供回调,而是订阅事件以完成操作,并且获得 SocketAsyncEventArgs,而不是 IAsyncResult。这个想法是您可以重用 SocketAsyncEventArgs 并为套接字 IO 预分配内存。在高性能场景中,这比使用 APM 风格要高效得多。此外,如果您预先分配内存,您将获得稳定的内存占用、减少垃圾收集、固定造成的内存漏洞等。请注意,只有在最高性能的情况下才应考虑担心这一点。
- MSDN 杂志:接触 .NET Framework 3.5 http://msdn.microsoft.com/en-us/magazine/cc163356.aspx
- MSDN 信息与预分配内存技术 http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx
Summary
大多数情况下使用 APM 风格的回调方法,除非您更喜欢 SocketAsyncEventArgs / Async 方法的风格。如果您在 WinSock 中使用过 CompletionPorts,您应该知道这两种方法在幕后都使用 CompletionPorts。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)