2016-08-26 49 views
0

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

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

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

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

回答

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

正在异步避免阻塞操作。阻塞操作意味着被阻塞的线程不能用于其他任何事情,并且如果它是UI线程,那么UI也被阻塞。

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

  1. 客户端是否总是收到服务器的响应? 3.如果您知道数据将在先前的数据发送后不久发送,应该关闭连接。

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

  • 它是一个好主意,使不同的线程处理的每个客户端的通信
  • 号见上文关于线程是昂贵的。最好有一小撮线程为大量客户提供服务。对于简单的情况 - 例如。在学习时 - 从每个客户端模型的线程开始可能会更容易,但它不会扩展到客户端数量的小型**

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

  • 是否有使用我发送从文件读取字节通过TCP连接来实现文件共享,而不是使用FTP方法的方法中的任何缺点?
  • 你想要多长时间的清单?开始于:

    • FTP是一种标准且广泛支持。
    • FTP允许单个客户端会话执行许多操作。
    • 在用完其他资源(假设您没有先用完线程堆栈的虚拟地址空间)之前,您将通过线程调度使CPU停止运行。

    *不同的操作系统有不同的线程/进程机型不同的工程权衡。

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

    ***例如,Socket类有它异步的不同型号的支持。

    0
    1. 为什么是异步?这很容易!您有2个选择:打开新线程并在套接字读取操作中阻止它或使用异步套接字。线程唯一的问题是线程是重物。每个打开的.net线程需要1MB的内存,并且您还需要开始思考多线程范例。

    2. 没有

    3. 没有

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