首页 文章

TCP / IP .NET套接字效率

提问于
浏览
0

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

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

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

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

2 回答

  • 0

    为什么要使用异步连接?

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

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

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

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

    让不同的线程处理每个客户端的通信是一个好主意

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

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

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

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

    • FTP是一种标准并得到广泛支持 .

    • FTP允许单个客户端会话执行许多操作 .

    • 你首先用完线程堆栈的虚拟地址空间 .


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

    **你没有说你的系统大小(客户端数量,连接速率,数据量......)所以我只能非常一般 .

    ***例如,Socket类支持三种不同的异步性模型 .

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

    • 没有

    • 没有

    • 没有异步,你没有任何其他选择

相关问题