当前位置:编程学习 > C#/ASP.NET >>

为何我局域网用udp传送的文件都会损坏?文本文件能正常打开

如题,程序已经将文件分包传送,每包1000字节,也有序号。但是传送过去的文件都打不开,接收到的文件大小是正确的 --------------------编程问答-------------------- 文件是什么格式的 关注格式 传输字节流 接受文件后的保存方式 完毕 --------------------编程问答-------------------- 大小精确到字节了吗?是一样大?

用HexWorkshop比较一下两个文件是不是一样的 --------------------编程问答-------------------- 文件格式是rar压缩文件,另外mp3格式的传过去也无法播放,txt格式的可以正常打开,其他格式没有测试,接受字节流后保存方式用的 File.WriteAllBytes --------------------编程问答-------------------- 难道和字节顺序有关系? --------------------编程问答-------------------- 精确到字节后发现少了4000的字节,怎么会少的?丢包?还是其他什么原因?
        代码如下
        private void Listen()
        {
            int port = 8889;

            UdpClient listener = new UdpClient(port);
            int m_intSerial = 0; //数据包顺序号
            int m_intBlocks = 0; //数据分割块数   
            int m_intLength = 0; //数据长度   
            int m_intMessageLength = 0;
            int diushi=0;
            int place = 0;
            int m_intGetCount = 0;
            int m_intBlockLength = 1000;
            IPEndPoint iep = new IPEndPoint(IPAddress.Parse("192.168.0.110"), 8889);

            try
            {
                
                while (true)
                {
                    byte[] bytesF = listener.Receive(ref   iep);
                    place = 0;
                    m_intSerial = BitConverter.ToInt32(bytesF, place);//获得本次包顺序号
                    place += 4;
                    m_intBlocks = BitConverter.ToInt32(bytesF, place);//获得数据总包数
                    place += 4;
                    m_intLength = BitConverter.ToInt32(bytesF, place);//获得本次包数据长度
                    place += 4;
                    m_intMessageLength = BitConverter.ToInt32(bytesF, place);//获得总数据长度
                    place += 4;

                    byte[] data = new byte[m_intMessageLength]; //申明数据的总长   

                    Array.Copy(bytesF, 16, data, m_intBlockLength * m_intSerial, m_intLength); //复制本包数据   

                    //m_intGetCount = m_intGetCount + 1;
                    Application.DoEvents();
                    if (m_intBlocks > 1)
                    {
                        while (true)
                        {
                            if (m_intGetCount >= m_intBlocks)
                            {
                                break;


                            }
                            byte[] bytes = listener.Receive(ref   iep);
                            place = 0;
                            m_intSerial = BitConverter.ToInt32(bytes, place);
                            place += 4;
                            m_intBlocks = BitConverter.ToInt32(bytes, place);
                            place += 4;
                            m_intLength = BitConverter.ToInt32(bytes, place);
                            place += 4;
                            m_intMessageLength = BitConverter.ToInt32(bytes, place);
                            place += 4;
                            Array.Copy(bytes, 16, data, m_intBlockLength * m_intSerial, m_intLength); //复制数据   
                            m_intGetCount = m_intGetCount + 1;
                           
                            
                            progressBar1.Value = (int)(m_intGetCount / m_intBlocks * 100);                            
                            Application.DoEvents();
                           // MessageBox.Show("共有数据包" + m_intBlocks + "个,得到" + m_intGetCount + "个", "收d到数据检测");

                        }
                    }
                    
                    File.WriteAllBytes("E:\\1.mp3", data);
                    MessageBox.Show("共有数据包" + m_intBlocks + "个,得到" + m_intGetCount + "个", "收到数据检测");
                    if (m_intGetCount >= m_intBlocks)
                    {
                        break;


                    }
                }
                
            }
            catch (System.Exception pe)
            {
                Console.WriteLine(pe.ToString());
            }
        } --------------------编程问答-------------------- 文件读写格式,采用二进制格式,不要用文本格式。 --------------------编程问答-------------------- 请问如何将传输过来的字节数组转换为2进制数据并写入文件 --------------------编程问答-------------------- 哪位能回答一下啊,传输非文本格式的文件就会出错,打不开,为什么啊? --------------------编程问答--------------------
引用 6 楼 kugou123 的回复:
文件读写格式,采用二进制格式,不要用文本格式。

估计就是这个原因 --------------------编程问答--------------------
引用 9 楼 huoxudong125 的回复:
引用 6 楼 kugou123 的回复:
文件读写格式,采用二进制格式,不要用文本格式。 
 
估计就是这个原因

FileStream fs=new FileStream("e:\\3.mp3",FileMode.creat,FileAccess.Write);
BinaryWriter bw=new BinaryWiter(fs);
bw.Write(data);
这样写吗?试了不行,另外我在读文件的时候 如果不传输,而直接再在本机上写出来一个文件就行,只要传输出去再接收就打不开了 --------------------编程问答-------------------- 继续求助,头都大了 --------------------编程问答-------------------- 刚刚测试,发现发送给对方的文件在对方的机器上无法打开,如果复制回来就能打开,这是为什么 --------------------编程问答-------------------- 对方机子有病毒 --------------------编程问答-------------------- 帮顶,我的也是啊,头都大了,想死的心都有啊 --------------------编程问答-------------------- 要不没发全,要不顺序不对!
--------------------编程问答-------------------- 应该是文件没发全把 --------------------编程问答-------------------- udp从来都不保证能够收到,在网络或者收发端某个机器及其繁忙时,50%消息都丢失了也不足为奇。要想基本保证能够收到消息,应该使用tcp而不是udp。

另外,在局域网里使用1M的数据块已经算是很小的了,1000个字节未免太小了吧?! --------------------编程问答-------------------- 具体bug自己慢慢找吧。 --------------------编程问答--------------------
引用 6 楼 kugou123 的回复:
文件读写格式,采用二进制格式,不要用文本格式。


正解
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,