【问题标题】:Transferring files over TCP with CopyTo()使用 CopyTo() 通过 TCP 传输文件
【发布时间】:2014-04-15 10:59:01
【问题描述】:

我有一个关于 Stream 类的 CopyTo() 方法的问题:

https://docs.microsoft.com/en-us/dotnet/api/system.io.stream.copyto

这种方法适用于我尝试过的大约 15kb 的小文件,但任何更高的文件(我用 2mbs、4mbs 等进行了测试)并且它只是挂在 CopyTo() 方法上。实在想不通为什么。

代码示例:


服务器的句柄客户端:

public void HandleClient(object c)
{
    string path = "some path";
    using (TcpClient client = (TcpClient)c)
    {
        using (NetworkStream netStream = client.GetStream())
        {
            using (FileStream fileStream = new FileStream(path, FileMode.Create))
            {
                netStream.CopyTo(fileStream);
            }
        }
    }
}

客户端发送:

public void Send()
{
    IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse("some address"), 12345);
    string path = "some path";

    using (TcpClient client = new TcpClient(remoteEndPoint))
    {
        using (NetworkStream netStream = client.GetStream())
        {
            using (FileStream fileStream = new FileStream(path, FileMode.Open))
            {
                fileStream.CopyTo(netStream);
            }
        }
    }
}

附:当我研究我的网络编程方式时,我经常发现有人建议其他人切换到 WCF 来完成这类任务,因为显然 WCF 使一切变得容易得多。你们有什么建议,您能否为 WCF 菜鸟提供一些链接,这些链接对 LAN 文件共享应用程序建模很有用,因为这就是我的目标?

【问题讨论】:

  • WCF 确实非常强大,但不幸的是,很难正确配置它,有很多相互关联的节流设置可能会妨碍您(一些客户端,一些服务器端),尤其是在处理您想要完成的大量数据传输时。祖先技术(.Net Remoting)不是很灵活,有很多硬编码设置。 WCF 走向相反的方向,一切都是超级可配置的。即使有这个困难,它肯定比设计自己的通信协议恕我直言更好。
  • 考虑使用 HTTP 或 FTP。图书馆是可用的。很容易做对。
  • 感谢您的回复。关于 FTP,这对于文件共享应用程序来说是一个可行的解决方案吗?目标是能够将文件发送到局域网中的任何电脑。
  • 无需打开套接字,只需打开 HTTP 端点。原理相同,细节更简单。

标签: c# file sockets tcpclient tcplistener


【解决方案1】:

我设法解决了 CopyTo() 问题。问题是我在主线程上发送文件,所以整个应用程序只是阻塞了更大的文件,这些文件需要超过一秒钟的时间才能传输。

将发送操作放在一个单独的线程中并测试发送最多 3 GB,它应该可以正常工作。现在,有什么方法可以跟踪 CopyTo() 操作的进度吗?在我看来,我不能,如果我想跟踪进度,我应该手动传输。

感谢所有参与的人:)

【讨论】:

    【解决方案2】:

    我不确定您是否可以对大于缓冲区大小的文件执行 CopyTo。也许,您可以尝试通过将文件拆分为每个缓冲区大小来编写它。

    【讨论】:

    • 如果最大传输大小受缓冲区大小限制,CopyTo 将毫无用处。
    • @usr :这是质疑隐含陈述的陈述还是表明 Bahaika 的错误?
    • @D6mi 我质疑这个答案将 OP 带向了解决方案。我正在为我的反对票辩护。
    • 我给出了一个理论上的解决方案,我可以提供一个代码来演示我所说的。
    • @Bahaïka 如果你喜欢,它不会有伤害的 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 2015-11-19
    • 2011-06-26
    • 1970-01-01
    • 2018-01-21
    • 2012-07-12
    • 1970-01-01
    相关资源
    最近更新 更多