c# - 发送给客户端后获取无效的 Zip 文件

标签 c# networking zip

我正在尝试使用 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/

相关文章:

java - 如何在 Java 中高效地构建应用程序网络

c++ - 如何在 Linux 上以编程方式添加接口(interface)?

arrays - 如何在同一个 Swift 循环中迭代三个或更多数组?

zip - zip /7zip压缩差异

c# - 如何在运行时向表中添加单元格

c# - `ClaimsPrincipal.IsInRole` 在声明中期望什么?

c# - 来自 "Programming Interviews Exposed"的代码练习

algorithm - 网络上的泛洪算法

javascript - NodeJS : How to zip (local) files after done with JIMP

c# - 在单个 View 中对 RadioButton 进行分组,并正确回传表单数据