使用CopyTo()在TCP上传输文件



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

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

这种方法适用于大约15kb的小文件,但任何更高的文件(我测试了2mb, 4mb等),它只是挂在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);
            }
        }
    }
}

Client send:

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新手,这将有助于建模一个局域网文件共享应用程序,因为这是我的目标?

我设法解决了CopyTo()问题。问题是我是在主线程上发送文件的,所以整个应用程序都阻塞了需要超过瞬间传输的大文件。

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

感谢所有参与的人:)

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

相关内容

  • 没有找到相关文章

最新更新