我正在尝试使用 TCP 端口将 zip 文件从服务器发送到客户端。 我正在服务器文件夹中创建一个 zip 文件,将其读入字节数组,将其发送到连接的客户端,将字节写入文件并将其存储在客户端文件夹中。目前该进程仅在同一台计算机上。
但是,每当将 zip 文件保存到客户端文件夹时,它要么是无效的 zip,要么是包含损坏文件的 zip。发生这种情况时,它们的大小将与服务器文件夹中的 zip 文件完全相同,因此我认为我不会在网络传输中丢失任何字节。服务器 zip 文件也按预期工作,您可以打开并查看文件夹中的内容。
客户端 zip 和服务器 zip 之间的哈希值不同。我已经使用常规 .txt、.cs 和 .csv 文件进行了测试,这些文件已发送并可以在客户端文件夹中打开。它们与对应的服务器具有相同的属性。
我发送的 zip 文件中只有一个 .csv、一个 .txt 和一个 .cs 文件。
这是我的代码
服务器:
using System.Net.Sockets;
using System.Net;
using System.Security.Cryptography;
using System.IO.Compression;
String filename = "C:\\BabyServerZip\\ServerFiles.zip";
File.Delete("C:\\BabyServerZip\\ServerFiles.zip");
ZipFile.CreateFromDirectory("C:\\BabyServerSend", "C:\\BabyServerZip\\ServerFiles.zip");
IPHostEntry ipHostInfo = Dns.GetHostEntry("localhost");
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint endpoint = new(ipAddress, 58008);
Socket listener = new(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(endpoint);
listener.Listen();
var handler = await listener.AcceptAsync();
var buffer = new byte[1024];
buffer = File.ReadAllBytes(filename);
handler.Send(buffer);
客户:
using System.Text;
using System.Net;
using System.Net.Sockets;
String outputPath = "C:\\BabyClientReceive\\sent.zip";
IPHostEntry = ipHostInfo = Dns.GetHostEntry("localhost");
IPAddress serverIP = ipHostInfo.AddressList[0];
IPEndPoint clientEnd = new(serverIP, 58008);
Socket clientSocket = new(clientEnd.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
clientSocket.ConnectAsync(clientEnd);
while (true)
{
if (clientSocket.Available > 0)
{
using (StreamWriter fw = new StreamWriter(outputPath))
{
char[] response;
do
{
var buffer = new byte[1024];
int received = clientSocket.Receive(buffer, SocketFlags.None);
response = Encoding.ASCII.GetChars(buffer, 0, received);
fw.Write(response, 0, received);
while (response.Length == 1024);
fw.Flush();
fw.Close();
}
}
}
为了通过网络正确发送 zip 文件,我是否缺少某些内容?为什么未压缩的文件可以正常工作而 zip 文件却损坏?
最佳答案
感谢 @MySkullCaveIsADarkPlace 的提示,解决了该问题。
StreamWriter 是一个文本编写器,zip 文件是二进制的。将 StreamWriter 切换为 BinaryWriter 解决了该问题。
关于c# - 发送给客户端后获取无效的 Zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74034031/