[使用tcpclient和服务器进行C#文件传输

问题描述 投票:0回答:1

[当我发送带有以下代码的文件时,缺少一些数据(小尺寸)。文件大小在接收方不匹配。发送常规字符串很好,因此这里没有连接问题。我只是在寻找最小的改进来解决该问题,稍后我将添加错误检查等。谢谢!该代码大部分是从一些教程中复制的,但是我不记得是哪个...

客户端是std .Net TcpClient类Client.Client是它的套接字

public void SendFile2(string fileName)
        {
            using (FileStream fs = File.OpenRead(fileName))
            {
                byte[] lenBytes = BitConverter.GetBytes((int)fs.Length);
                Client.Client.Send(lenBytes);

                byte[] buffer = new byte[1024];
                int bytesRead;
                fs.Position = 0;

                while ((bytesRead = fs.Read(buffer, 0, 1024)) > 0)
                    Client.Client.Send(buffer, bytesRead, SocketFlags.None);
            }
        }

        public bool ReceiveFile2(string fileName)
        {
            using (FileStream fs = File.Create(fileName))
            {
                byte[] lenBytes = new byte[4];

                if (Client.Client.Receive(lenBytes) < 4)
                    return false;

                long len = BitConverter.ToInt32(lenBytes, 0);
                byte[] buffer = new byte[1024];
                int bytesRead;

                while ((bytesRead = Client.Client.Receive(buffer)) > 0)
                    fs.Write(buffer, 0, bytesRead);

                return len == fs.Position;
            }
        }

解决方案:

public void SendFile(string fileName)
    {
        using (FileStream fs = File.OpenRead(fileName))
        {
            byte[] lenBytes = BitConverter.GetBytes((int)fs.Length);
            Client.Client.Send(lenBytes);

            byte[] buffer = new byte[1024];
            int bytesRead;
            fs.Position = 0;

            while ((bytesRead = fs.Read(buffer, 0, 1024)) > 0)
                Client.Client.Send(buffer, bytesRead, SocketFlags.None);
        }
    }

    public bool ReceiveFile(string fileName)
    {
        using (FileStream fs = File.Create(fileName))
        {
            byte[] lenBytes = new byte[4];

            if (Client.Client.Receive(lenBytes) < 4)
                return false;

            long len = BitConverter.ToInt32(lenBytes, 0);
            byte[] buffer = new byte[1024];
            int bytesRead;

// Changed from here
            while (fs.Position < len)
            {
                bytesRead = Client.Client.Receive(buffer);
                fs.Write(buffer, 0, bytesRead);
            }
// To here

            return len == fs.Position;
        }
    }
c# networking tcp
1个回答
0
投票

我认为这行可能是个问题。

if (Client.Client.Receive(lenBytes) < 4)while ((bytesRead = Client.Client.Receive(buffer)) > 0)

您的代码中有两个接收项。

所以您删除了第一个字节。这可以解释您在文件大小上看到的差异。

© www.soinside.com 2019 - 2024. All rights reserved.