发送二进制文件的TcpClient - 文件大于源 [英] Sending Binary File TcpClient - File Is Larger Than Source

查看:233
本文介绍了发送二进制文件的TcpClient - 文件大于源的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

要放在我的脚趾在网络编程的水,我写了一个小控制台应用程序发送一个PNG文件到服务器(另一个控制台应用程序)。正在由服务器写入的文件比源PNG文件稍大。而且它不会打开。

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.

在$ C $下的客户端应用程序是:

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

            }
        }

    }

在code对服务器程序是:

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

的书面文件的大小是24,103Kb,而源文件是仅24,079Kb

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?

干杯

推荐答案

您正在编写使用的BinaryFormatter你的输出。我是pretty的肯定,这将在输出的开始添加一些字节来表示你的输出类型(在这种情况下System.Byte [])。
只要写字节直接输出到文件,而无需使用格式:

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

这篇关于发送二进制文件的TcpClient - 文件大于源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆