我正在开发一个 TCP 文件传输客户端-服务器程序。目前,我能够完美地发送文本文件和其他文件格式,例如在服务器端保持所有内容完好无损的 .zip。但是,当我传输 .gif 时,最终结果是一个与原始大小相同的 gif,但只有部分图像显示好像大部分字节在服务器端丢失或未正确写入。
客户端向服务器发送一个包含文件名称和大小的 1KB 标头数据包。如果准备好,服务器会以 OK 响应,然后创建一个与要发送的文件一样大的 fileBuffer。
这是一些代码来演示我的问题:
// 处理正在发送的数据的服务器端方法片段 而(真) { // 旋转数据 如果(流[0].DataAvailable) { 流[0].Read(fileBuffer, 0, fileBuffer.Length); 休息; } } // 完成接收文件,从缓冲区写入创建的文件 FileStream fs = File.Open(LOCAL_FOLDER + fileName, FileMode.CreateNew, FileAccess.Write); fs.Write(fileBuffer, 0, fileBuffer.Length); fs.Close(); Print("文件成功接收。");
// 处理文件发送的客户端方法片段 而(真) { con.Read(ackBuffer, 0, ackBuffer.Length); // 等待OK响应开始发送 if (Encoding.ASCII.GetString(ackBuffer) == "OK") { // 将文件转换为字节 FileStream fs = new FileStream(inPath, FileMode.Open, FileAccess.Read); fileBuffer = 新字节[fs.Length]; fs.Read(fileBuffer, 0, (int)fs.Length); fs.Close(); con.Write(fileBuffer, 0, fileBuffer.Length); con.Flush(); 休息; } }
我尝试了二进制编写器,而不是仅使用具有相同结果的文件流。
我是否认为成功的文件传输就像转换为字节、传输然后转换回文件名/类型一样简单?
非常感谢所有帮助/建议。