使用CopyTo()通过TCP传输文件

时间:2014-03-11 17:38:59

标签: c# file sockets tcpclient tcplistener

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

http://msdn.microsoft.com/en-us/library/dd782932(v=vs.110).aspx

这种方法适用于大约15kb的小文件,因为我尝试过,但是更高(我测试了2mb,4 mbs等),它只是挂在CopyTo()方法上。无法弄明白为什么,这就是为什么我要问SO的无所不知的人:)

代码示例:


服务器处理客户端:

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);
            }
        }
    }
}

P.S。在我研究网络编程的过程中,我经常发现人们建议其他人切换到WCF来完成这类任务,因为显然,WCF使一切变得更加容易。你们有什么建议,你能为WCF noob提供一些链接,这对于建立局域网文件共享应用程序非常有用,因为我的目标是什么?

2 个答案:

答案 0 :(得分:0)

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

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

感谢所有参与者:)

答案 1 :(得分:-1)

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