首页
学习
活动
专区
工具
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协议来建立网络连接,并将文件分块传输。接收方会先读取文件名和大小,然后逐块接收文件内容,并将其写入本地文件。这种方法可以有效地处理大文件的传输,同时避免了内存溢出的风险。

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

相关·内容

2分25秒

090.sync.Map的Swap方法

6分33秒

088.sync.Map的比较相关方法

1分4秒

人工智能之基于深度强化学习算法玩转斗地主,大你。

5分25秒

046.go的接口赋值+嵌套+值方法和指针方法

6分13秒

人工智能之基于深度强化学习算法玩转斗地主2

18分12秒

基于STM32的老人出行小助手设计与实现

2分33秒

SuperEdge易学易用系列-如何借助tunnel登录和运维边缘节点

9分19秒

036.go的结构体定义

1分23秒

3403+2110方案全黑场景测试_最低照度无限接近于0_20230731

7分31秒

人工智能强化学习玩转贪吃蛇

3分59秒

基于深度强化学习的机器人在多行人环境中的避障实验

12分26秒

AJAX教程-01-全局刷新和局部刷新【动力节点】

领券