在C#中通过网络发送大文件的好方法是使用分块传输技术。这种方法可以将大文件分解为较小的数据块,逐个传输,以避免一次性加载整个文件导致内存溢出的问题。以下是一个简单的C#代码示例,演示如何使用分块传输技术发送大文件:
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协议来建立网络连接,并将文件分块传输。接收方会先读取文件名和大小,然后逐块接收文件内容,并将其写入本地文件。这种方法可以有效地处理大文件的传输,同时避免了内存溢出的风险。
领取专属 10元无门槛券
手把手带您无忧上云