请问有人能指导我如何在C#/.net 3.5中学习网络编程吗?欢迎提供代码示例和解释。基本上,我正在寻找如何实现异步/多线程的服务器/客户端模型。
我对如何在C++中使用WinSock完成这项任务比较熟悉,但是尽管进行了大量的研究,仍然无法掌握C#中的这个概念。
非常感谢您能提供的任何帮助 :)
请问有人能指导我如何在C#/.net 3.5中学习网络编程吗?欢迎提供代码示例和解释。基本上,我正在寻找如何实现异步/多线程的服务器/客户端模型。
我对如何在C++中使用WinSock完成这项任务比较熟悉,但是尽管进行了大量的研究,仍然无法掌握C#中的这个概念。
非常感谢您能提供的任何帮助 :)
它们提供了相对较薄的套接字包装器。它在套接字上提供了一种流。您可以在NetworkStream上使用异步方法(BeginRead等)。我不喜欢这个,因为包装器的作用不大,并且使用它比直接使用套接字更麻烦。
这提供了经典的Select技术,以将多个套接字IO复用到单个线程中。不再推荐使用。
套接字的异步编程模型(又称IAsyncResult、Begin/End样式)是使用套接字进行异步操作的主要技术。而且有几个变体。基本上,您调用一个异步方法(例如,BeginReceive),并执行以下操作之一:
最好的方法是#3,因为它通常是最方便的。如果不确定,请使用此方法。
一些链接:
.NET 3.5引入了一种使用事件的新型异步套接字模型。它使用“简化”的异步模型(例如Socket.SendAsync)。您不需要提供回调函数,而是订阅完成事件;您也不需要使用IAsyncResult,而是使用SocketAsyncEventArgs。其思想是可以重用SocketAsyncEventArgs,并为套接字IO预分配内存。在高性能场景下,这比使用APM风格更有效率。此外,如果预分配内存,则可以获得稳定的内存占用、减少垃圾收集、避免由固定引起的内存空洞等优点。请注意,只有在最高性能的情况下才需要考虑这些问题。
对于大多数情况,请使用APM风格的回调方法,除非您更喜欢SocketAsyncEventArgs / Async方法的风格。如果您曾经在WinSock中使用过CompletionPorts,则应该知道这两种方法都在底层使用CompletionPorts。
这取决于你想要关注什么。
如果你想专注于功能,把底层工作交给框架处理,那么可以从Windows Communication Foundation开始。
如果你想自己构建底层工作,那么可以使用System.Net.Sockets.Socket
类。