gpt4 book ai didi

c# - TCP/IP .NET 套接字效率

转载 作者:可可西里 更新时间:2023-11-01 02:57:50 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

  1. Why use asynchronous connections?

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

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

  1. Should the client always receive a response from the server? 3. Should the connection be closed if you know data will be send shortly after the previous data sent.

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

  1. Is it a good idea to make different threads handle each client's communication

没有。参见上面关于线程昂贵的内容。最好让一小部分线程为大量客户端提供服务。对于简单的情况——例如。学习时 – 从每​​个客户端线程模型开始可能更容易,但它不会扩展到小** 客户端数量之外。

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

  1. Is there any disadvantage of using my method of sending read bytes from a file over a TCP connection to achieve file sharing rather than using an FTP approach?

你想要多长的列表?开始于:

  • FTP 是一种标准并得到广泛支持。
  • FTP 允许单个客户端 session 执行许多操作。
  • 在用完其他资源之前,您会因线程调度而使 CPU 停滞不前(假设您没有先用完线程堆栈的虚拟地址空间)。

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

** 您没有说明系统的大小(客户端数量、连接率、数据量……),所以我只能说得很笼统。

*** 例如 Socket类在其中支持三种 不同的异步模型。

关于c# - TCP/IP .NET 套接字效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39160227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com