TCP / IP .NET套接字效率

时间:2016-08-26 07:01:46

标签: c# multithreading sockets tcp

我创建了一个处理TCP连接的库。它存在于服务器和客户端之外。根据MSDN的所有示例和受信任源的建议,我应该在TcpClient和TcpListener之间建立连接,然后将数据从TcpClient发送到TcpListener并接收响应,最后关闭连接。

但我采取了不同的方法:首先,我没有使用异步连接。其次,我没有让客户端在向服务器发送数据后等待响应。第三,我没有关闭连接。

我没有选择异步路径,因为我不知道使用它的优点。我没有让客户端等待响应,因为服务器不会响应某些消息。我没有关闭连接,因为我觉得客户端需要很长时间才能重新连接到服务器,只是为了快速通过流发送一些数据。由于连接未关闭,我仍然希望新客户端能够连接,因此我创建了流侦听器 - 现有客户端 - 侦听不同的线程。由于我不知道如何使用FTP,我使用FileStream来读取文件并将它们转换为通过TCP连接发送的字节。

我的问题是: 1.为什么要使用异步连接? 2.客户端是否应始终收到服务器的响应? 3.如果您知道在发送先前数据后不久将发送数据,是否应关闭连接。 4.让不同的线程处理每个客户端的通信是一个好主意。我使用ThreadPool,尽管我不确定线程​​的执行是如何工作的。是否在一个线程中异步执行不同的操作? 5.使用我通过TCP连接从文件发送读取字节的方法来实现文件共享而不是使用FTP方法有什么不利之处吗?

2 个答案:

答案 0 :(得分:3)

  
      
  1. 为什么要使用异步连接?
  2.   

异步可以避免阻塞操作。阻塞操作意味着阻塞的线程不能用于其他任何东西,如果它是UI线程,那么UI也会被阻止。

线程是一种宝贵的资源,在Windows * 上,不要浪费它们等待其他可能永远不会响应的进程。

  
      
  1. 客户端是否应始终收到服务器的响应? 3.如果您知道在上一次发送数据后不久将发送数据,是否应关闭连接。
  2.   

这些都取决于您正在实施的协议。在某些情况下,简单的请求,响应和关闭就是方法。在其他情况下,连接可能是长寿的,大多数数据是单向的。在某些情况下,单个客户端可能会使用多个并发套接字。

  
      
  1. 让不同的线程处理每个客户的通信是个好主意
  2.   

没有。请参阅上文有关昂贵的线程。最好有一小部分线程服务于大量客户端。对于简单的情况 - 例如。在学习时 - 从每个客户端模型的线程开始可能更容易,但它不会超出小的 ** 数量的客户端。

最后你不可能做得比框架中的更好:有很多经验(和失败的方法 *** )在使用TCP / IP实现服务器的历史中。

  
      
  1. 使用我通过TCP连接从文件发送读取字节的方法来实现文件共享而不是使用FTP方法有什么不利吗?
  2.   

你想要一个列表多长时间?从:

开始
  • FTP是一种标准并得到广泛支持。
  • FTP允许单个客户端会话执行许多操作。
  • 在耗尽其他资源之前,您将使用线程调度来降低CPU(假设您没有首先用完线程堆栈的虚拟地址空间)。

* 不同的操作系统具有不同的线程/过程模型,具有不同的工程权衡。

** 您对系统的大小(客户端数量,连接速率,数据量......)一无所知,所以我只能非常一般。

*** 例如,Socket类支持三个不同的异步模型。

答案 1 :(得分:0)

  1. 为什么异步?这很简单!您有两种选择:打开新线程并在套接字读取操作时阻止它或使用异步套接字。线程唯一的问题是线程是重物。每个打开的.net线程占用1MB内存,你也需要开始考虑多线程范例。

  2. 没有

  3. 没有

  4. 没有异步,您没有任何其他选择