我创建了一个处理TCP连接的库。它存在于服务器和客户端之外。根据MSDN的所有示例和受信任源的建议,我应该在TcpClient和TcpListener之间建立连接,然后将数据从TcpClient发送到TcpListener并接收响应,最后关闭连接。
但我采取了不同的方法:首先,我没有使用异步连接。其次,我没有让客户端在向服务器发送数据后等待响应。第三,我没有关闭连接。
我没有选择异步路径,因为我不知道使用它的优点。我没有让客户端等待响应,因为服务器不会响应某些消息。我没有关闭连接,因为我觉得客户端需要很长时间才能重新连接到服务器,只是为了快速通过流发送一些数据。由于连接未关闭,我仍然希望新客户端能够连接,因此我创建了流侦听器 - 现有客户端 - 侦听不同的线程。由于我不知道如何使用FTP,我使用FileStream来读取文件并将它们转换为通过TCP连接发送的字节。
我的问题是: 1.为什么要使用异步连接? 2.客户端是否应始终收到服务器的响应? 3.如果您知道在发送先前数据后不久将发送数据,是否应关闭连接。 4.让不同的线程处理每个客户端的通信是一个好主意。我使用ThreadPool,尽管我不确定线程的执行是如何工作的。是否在一个线程中异步执行不同的操作? 5.使用我通过TCP连接从文件发送读取字节的方法来实现文件共享而不是使用FTP方法有什么不利之处吗?
答案 0 :(得分:3)
- 为什么要使用异步连接?
醇>
异步可以避免阻塞操作。阻塞操作意味着阻塞的线程不能用于其他任何东西,如果它是UI线程,那么UI也会被阻止。
线程是一种宝贵的资源,在Windows * 上,不要浪费它们等待其他可能永远不会响应的进程。
- 客户端是否应始终收到服务器的响应? 3.如果您知道在上一次发送数据后不久将发送数据,是否应关闭连接。
醇>
这些都取决于您正在实施的协议。在某些情况下,简单的请求,响应和关闭就是方法。在其他情况下,连接可能是长寿的,大多数数据是单向的。在某些情况下,单个客户端可能会使用多个并发套接字。
- 让不同的线程处理每个客户的通信是个好主意
醇>
没有。请参阅上文有关昂贵的线程。最好有一小部分线程服务于大量客户端。对于简单的情况 - 例如。在学习时 - 从每个客户端模型的线程开始可能更容易,但它不会超出小的 ** 数量的客户端。
最后你不可能做得比框架中的更好:有很多经验(和失败的方法 *** )在使用TCP / IP实现服务器的历史中。
- 使用我通过TCP连接从文件发送读取字节的方法来实现文件共享而不是使用FTP方法有什么不利吗?
醇>
你想要一个列表多长时间?从:
开始* 不同的操作系统具有不同的线程/过程模型,具有不同的工程权衡。
** 您对系统的大小(客户端数量,连接速率,数据量......)一无所知,所以我只能非常一般。
*** 例如,Socket
类支持三个不同的异步模型。
答案 1 :(得分:0)
为什么异步?这很简单!您有两种选择:打开新线程并在套接字读取操作时阻止它或使用异步套接字。线程唯一的问题是线程是重物。每个打开的.net线程占用1MB内存,你也需要开始考虑多线程范例。
没有
没有
没有异步,您没有任何其他选择