通过Socket.SendFile发送大文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过Socket.SendFile发送大文件相关的知识,希望对你有一定的参考价值。

我想通过C#中的套接字发送文件。我正在使用服务器和客户端。

服务器:

       static void Main(string[] args)
    {
        Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        server.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 100));
        server.Listen(0);
        Socket client = server.Accept();
        client.SendFile("F:\TestMovie.mp4");
        server.Close();
        Console.ReadKey();
    }

客户:

   static void Main(string[] args)
    {
        Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        client.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 100));

        byte[] buff = new byte[10048];
        int index = client.Receive(buff);

        if (buff.Length < index)
        {
            Array.Resize<byte>(ref buff, index);
        }

        File.WriteAllBytes("F:\TestMovie.mp4", buff);
    }

我的意思是客户如何知道服务器发送的大小。

这有点简单,因为我只是用它作为测试。

但是服务器只能发送大小只有10KB左右的文件。

答案

我的意思是客户如何知道服务器发送的大小。

取决于你想要做什么。如果您之后只发送单个文件并关闭连接,则该结束意味着文件结束。你只需循环client.Receive()直到它返回0。一个可能更好的解决方案是依靠NetworkStream然后你可以做类似的事情

using (NetworkStream networkStream = new NetworkStream(client))
using (FileStream fileStream = File.Open("test.mp4", FileMode.OpenOrCreate))
{
    networkStream.CopyTo(fileStream);
}

但这只有在服务器完成发送后关闭客户端Socket时才能正常工作。

如果要传输多个文件,则必须使用协议进行通信,一个简单的方法是始终发送指示文件大小的intlong,然后让客户端读取该数据量。

另一答案

您可能遇到的是您的客户端的缓冲区已满。相反,请尝试使用流将数据写入磁盘。

注意:未经测试的代码

using(var stream = File.OpenWrite("path"))
{
    byte[] buff = new byte[2048];
    int read;

    try
    {
        do
        {
            read = client.Receive(buff);
            stream.Write(buff, 0, read);
        } while(read > 0);
    }
    catch(SocketException)
    {
        // exception is thrown when the socket was closed
    }
}

您可能还需要正确关闭套接字以避免使用client.Shutdown(SocketShutdown.Both);发送部分数据

以上是关于通过Socket.SendFile发送大文件的主要内容,如果未能解决你的问题,请参考以下文章

两片单片机通过串口一发一收的C语言例程

一片大好怎么样(效果好吗)副作用大不大

Python:使用cherrypy通过POST发送和接收大文件

无法通过 Java 中的套接字发送大文件

通过 HTTPS 发送大文件时的性能影响 [重复]

通过 WCF 休息服务发送大文件 (>10 MB)