发送二进制文件TcpClient - 文件大于源(Sending Binary File TcpClient - File Is Larger Than Source)

为了让我的脚趾在网络编程的水中,我写了一个小的控制台应用程序将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<byte>(); 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。

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

干杯

To put my toe in the water of Network programming, I wrote a little Console App to send a png file to a server (another console app). The file being written by the server is slightly bigger than the source png file. And it will not open.

The code for the client app is:

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(); } } }

The code for the Server app is :

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<byte>(); 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();

The size of the written file is 24,103Kb, whereas the source file is only 24,079Kb.

Is it apparent to anyone why this operation is failing?

Cheers

最满意答案

您正在使用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); } }

You are writing your output using a BinaryFormatter. I'm pretty sure that this will add some bytes at the start of the output to indicate the type that you're outputting (in this case System.Byte[]). Just write the bytes out directly to the file without using the formatter:

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); } }

更多推荐