首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在C#中通过网络发送大文件的好方法?

在C#中通过网络发送大文件的好方法是使用分块传输技术。这种方法可以将大文件分解为较小的数据块,逐个传输,以避免一次性加载整个文件导致内存溢出的问题。以下是一个简单的C#代码示例,演示如何使用分块传输技术发送大文件:

代码语言:csharp
复制
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;

public class FileTransfer
{
    private const int BufferSize = 4096;

    public static void SendFile(string fileName, string serverIp, int serverPort)
    {
        using (var client = new TcpClient(serverIp, serverPort))
        using (var networkStream = client.GetStream())
        using (var fileStream = File.OpenRead(fileName))
        {
            var fileInfo = new FileInfo(fileName);
            var fileSize = fileInfo.Length;

            // 发送文件名和大小
            var fileNameBytes = System.Text.Encoding.UTF8.GetBytes(fileName);
            networkStream.Write(fileNameBytes, 0, fileNameBytes.Length);
            networkStream.Write(BitConverter.GetBytes(fileSize), 0, 8);

            var buffer = new byte[BufferSize];
            int bytesRead;

            // 分块发送文件内容
            while ((bytesRead = fileStream.Read(buffer, 0, BufferSize)) > 0)
            {
                networkStream.Write(buffer, 0, bytesRead);
            }

            Console.WriteLine("File sent successfully.");
        }
    }

    public static void ReceiveFile(string clientIp, int clientPort)
    {
        using (var server = new TcpListener(IPAddress.Any, clientPort))
        {
            server.Start();
            using (var client = server.AcceptTcpClient())
            using (var networkStream = client.GetStream())
            using (var fileStream = new FileStream("receivedFile.txt", FileMode.Create, FileAccess.Write))
            {
                var buffer = new byte[BufferSize];
                int bytesRead;

                // 读取文件名和大小
                var fileNameBytes = new byte[256];
                networkStream.Read(fileNameBytes, 0, fileNameBytes.Length);
                var fileName = System.Text.Encoding.UTF8.GetString(fileNameBytes).TrimEnd('\0');
                var fileSizeBytes = new byte[8];
                networkStream.Read(fileSizeBytes, 0, 8);
                var fileSize = BitConverter.ToInt64(fileSizeBytes, 0);

                // 分块接收文件内容
                var totalBytesRead = 0;
                while (totalBytesRead< fileSize && (bytesRead = networkStream.Read(buffer, 0, BufferSize)) > 0)
                {
                    fileStream.Write(buffer, 0, bytesRead);
                    totalBytesRead += bytesRead;
                }

                Console.WriteLine("File received successfully.");
            }
        }
    }
}

在这个示例中,我们使用了TCP协议来建立网络连接,并将文件分块传输。接收方会先读取文件名和大小,然后逐块接收文件内容,并将其写入本地文件。这种方法可以有效地处理大文件的传输,同时避免了内存溢出的风险。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

消息服务框架使用案例之--大文件上传(断点续传)功能

消息服务框架使用案例之--大文件上传(断点续传)功能 一、分块上传和断点续传原理 在我们的一个产品应用中,客户需要上传大量的文件到服务器,其中不乏很大的视频文件。虽然可以使用FTP这样成熟稳定的工具,但客户表示不会使用FTP工具,并且我们产品也觉得客户从我们软件在切换到FTP用户体验不好,如果做成后台脚本调用FTP上传那么进度信息很难呈现到我们软件上。最终,决定我们自己做文件上传功能。     大文件上传受限于服务器每次处理数据的能力,不能一次传输完成,所以分块上传是必然的了,由于上传时间可能较长,中途可能

05

.net mvc + layui做图片上传(二)—— 使用流上传和下载图片

摘要:上篇文章写到一种上传图片的方法,其中提到那种方法的局限性,就是上传的文件只能保存在本项目目录下,在其他目录中访问不到该文件。这与浏览器的安全性机制有关,浏览器不允许用户用任意的路径访问服务器上的资源,因为这可能造成服务器上其他位置的信息被泄露。浏览器只允许用户用相对路径直接访问本项目路径下的资源。那么,如果A项目要访问B项目上传的文件资源,这就产生问题了。所以这就需要另外一种方法来解决这个问题,那就是通过 流(Stream)的形式上传和下载文件资源。这种方法因为不是通过路径直接访问文件,而是先把文件读取的流中,然后将流中的数据写入到新的文件中,还原需要上传的文件,所以也就不存在上面的问题了。本片博客,着重介绍一下这种方式的实现。

03
领券