c# - 发送二进制文件 TcpClient - 文件大于源

标签 c# .net tcpclient tcplistener

为了尝试网络编程,我编写了一个小的控制台应用程序来将 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();

            }
        }

    }

服务器应用程序的代码是:

    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。

任何人都清楚此操作失败的原因吗?

干杯

最佳答案

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

关于c# - 发送二进制文件 TcpClient - 文件大于源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11396454/

相关文章:

c# - 比较两个对象的不同属性值

c# 重新启动 for 循环

c# - Entity Framework - SaveChanges() 未获取生成的身份 key

.net - 在 .Net 中, "using"会做我们被引导相信的事情吗?

c# - 仅当服务器在调用 ConnectAsync 之前开始监听时,TcpClient 才会连接

c# - 如何使 RawPrinterHelper 同时在 XPS_PATH 和 RAW 数据类型中工作?

c# - 插入数据时不将数据复制到表中

c# - 解决此错误需要进行哪些基本检查-找不到类型或 namespace 名称

.net - 在 .net FTP 服务器实现中获取我自己的主机名

java - 在 closeablehttpclient 中使用 keepalive