【问题标题】:Sending Mp3 File via tcpserver to a client通过 tcpserver 向客户端发送 Mp3 文件
【发布时间】:2021-06-04 01:49:47
【问题描述】:

我有一个如下的 tcp 客户端:

 public static void RunStream()
    {
        Console.WriteLine("Starting Stream...");
        TcpListener listen = new TcpListener(IPAddress.Parse("127.0.0.1"), 13000);
        listen.Start();
        while (true)
        {
            Console.Write("Waiting for a connection... ");
            Socket socket = listen.AcceptSocket();

            if (socket.Connected)
            {
                SendFile(socket);
                socket.Disconnect(false);
            }
        }
    }
    public static void SendFile(Socket socket)
    {
        NetworkStream netstream = new NetworkStream(socket);
        StreamWriter writer = new StreamWriter(netstream);
        FileStream fileStream = File.Open("file_example_MP3_700KB.mp3", FileMode.Open, FileAccess.Read, FileShare.Read);
        fileStream.CopyTo(netstream);
        netstream.Flush();
        netstream.Close();

    }

    static void Main(string[] args)
    {
        RunStream();
    }

和一个从服务器读取和保存流(包含 mp3 文件)的客户端,如下所示:

 static void Main(string[] args)
    {


        TcpClient client = new TcpClient("127.0.0.1", 13000);
        
        byte[] bytes = new byte[2100000];
        var stream = client.GetStream();
        int i;
        while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
        {
            stream.Write(bytes, 0, i);
        }
        File.WriteAllBytes("test.mp3", bytes);
        stream.Flush();
        client.Close();           
    }

问题是我只得到了原始 mp3 的 sn-p,例如,如果原始文件的持续时间为 24 秒,我只能得到前 5-8 秒

【问题讨论】:

    标签: c# tcp tcpclient tcplistener


    【解决方案1】:

    客户端的兄弟你写了stream.Read(bytes, 0, bytes.Length)这意味着你每次读取数据时都重写数组
    你使用一个大数组来保存你的数据,如果你发送一个大文件,这会产生问题
    像这样更好的代码兄弟:

        static void Main(string[] args)
        {
            TcpClient client = new TcpClient("127.0.0.1", 13000);
    
            var stream = client.GetStream();
            byte[] buff = new byte[1024]; //you can change length later, bigger arrays have more reading speed but give more ram
            FileStream filestream = new FileStream("test.mp3", FileMode.Create);
            while (stream.Length > stream.Position)
            {
                int readLength = stream.Read(buff, 0, buff.Length);
                filestream.Write(buff, 0, readLength);
            }
            stream.Flush();
            client.Close();
        }
    

    【讨论】:

    • 现在我收到此错误“此流不支持查找操作。” "
    • 在while条件下
    • @Leo 但对我来说很好。您的 .Net 框架版本是多少?
    • .Net core 3.1 在服务器和客户端上
    • @Leo 我在 .Net core 3.1 项目中导入了代码但找不到任何错误,(Error) 的原意是 (Runtime Exception)?
    猜你喜欢
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 2012-10-27
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多