发送二进制文件TcpClient – 文件大于源

为了让我的脚趾在网络编程的水中,我写了一个小的控制台应用程序将png文件发送到服务器(另一个控制台应用程序)。 服务器正在写入的文件略大于源png文件。 它不会打开。

客户端应用程序的代码是:

private static void SendFile() { using (TcpClient tcpClient = new TcpClient("localhost", 6576)) { using (NetworkStream networkStream = tcpClient.GetStream()) { //FileStream fileStream = File.Open(@"E:\carry on baggage.PNG", FileMode.Open); byte[] dataToSend = File.ReadAllBytes(@"E:\carry on baggage.PNG"); networkStream.Write(dataToSend, 0, dataToSend.Length); networkStream.Flush(); } } } 

Server应用程序的代码是:

  private static void Main(string[] args) { Thread thread = new Thread(new ThreadStart(Listen)); thread.Start(); Console.WriteLine("Listening..."); Console.ReadLine(); } private static void Listen() { IPAddress localAddress = IPAddress.Parse("127.0.0.1"); int port = 6576; TcpListener tcpListener = new TcpListener(localAddress, port); tcpListener.Start(); using (TcpClient tcpClient = tcpListener.AcceptTcpClient()) { using (NetworkStream networkStream = tcpClient.GetStream()) { using (Stream stream = new FileStream(@"D:\carry on baggage.PNG", FileMode.Create, FileAccess.ReadWrite)) { // Buffer for reading data Byte[] bytes = new Byte[1024]; var data = new List(); int length; while ((length = networkStream.Read(bytes, 0, bytes.Length)) != 0) { var copy = new byte[length]; Array.Copy(bytes, 0, copy, 0, length); data.AddRange(copy); } BinaryFormatter binaryFormatter = new BinaryFormatter(); stream.Position = 0; binaryFormatter.Serialize(stream, data.ToArray()); } } } tcpListener.Stop(); 

写入文件的大小为24,103Kb,而源文件仅为24,079Kb。

这个操作失败的原因是否明显?

干杯

您正在使用BinaryFormatter编写输出。 我很确定这会在输出的开头添加一些字节来指示你输出的类型(在本例中是System.Byte [])。
只需将字节直接写入文件而不使用格式化程序:

 using (Stream stream = new FileStream(@"D:\carry on baggage.PNG", FileMode.Create, FileAccess.ReadWrite)) { // Buffer for reading data Byte[] bytes = new Byte[1024]; int length; while ((length = networkStream.Read(bytes, 0, bytes.Length)) != 0) { stream.Write(bytes, 0, length); } }