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

C# TCP 异步Socket传文件时发现速度太快的时会出现接收的数据出错

如题:发现速度太快的时会出现接收的数据出错,导致接收的文件出错;但是如果在自己写的接收文件的函数中将每次接收的字节数信息打印在控制台或者在接收文件函数中加上一句Thread.Sleep(1)时,接收的文件又是正确的;但这样的话,传输的速度又变慢了,又没有人遇到过这个问题,还有这是什么原因引起的呢? --------------------编程问答-------------------- 你每次从流中read一定长度的数据,然后写入file,这样不行吗? --------------------编程问答--------------------
引用 1 楼 guyuekkk11 的回复:
你每次从流中read一定长度的数据,然后写入file,这样不行吗?
我就是这样弄的。。。 --------------------编程问答-------------------- 自己顶下,难道没人遇到过吗? --------------------编程问答-------------------- 看不懂你具体遇到了什么错误。 --------------------编程问答-------------------- 肯定粘包了。 --------------------编程问答-------------------- 贴出代码看看吧 --------------------编程问答-------------------- 得上代码啊,你这么说,谁知道你代码写的啥样,看代码才知道问题出在哪 --------------------编程问答-------------------- Thread.Sleep(1);1是毫秒啊,不会多影响传输的时间吧?我一般都是写Thread.Sleep(100)的,就是在等要接收的数据正确的传完 --------------------编程问答--------------------
 #region 接收文件
        /// <summary>
        /// 接收文件
        /// </summary>
        /// <param name="tcpClient">当前工作的socket</param>
        private void ReceiveFile(Socket tcpClient,byte[] data)
        {
            ClientObject clientObject = null;
            Socket endpoint = tcpClient;
            //byte[] byteInitCommand = null;  //初始命令
            byte[] byteCommand = null;//转变为定长字节的命令
            byte[] byteInfo = null;// 待发送的字节消息
            byte[] bytePackageLength = null;
            foreach (DictionaryEntry elment in socketToUserName)
            {
                clientObject = (ClientObject)elment.Value;
                if (endpoint == clientObject.ClientSocket)
                {
                    break;
                }
            }
            if (clientObject.CurrentFileSize - clientObject.ReceiveBytes > Max_Size)  //不是最后一个数据包
            {
                clientObject.FileStream.Write(data, 0, data.Length);
                clientObject.ReceiveBytes += data.Length;
                Thread.Sleep(1);                            
                Console.WriteLine("ReceiveBytes={0},端口号={1},文件名={2}", clientObject.ReceiveBytes, ((IPEndPoint)(clientObject.ClientSocket.RemoteEndPoint)).Port, clientObject.FileName[clientObject.NumberOfFiles]);
            }
            else    //最后一个数据包
            {
                clientObject.FileStream.Write(data, 0, data.Length);
                clientObject.ReceiveBytes += data.Length;
                clientObject.FileStream.Close();
                
                byteCommand = Encoding.Unicode.GetBytes("ReceiveSuccess");
                byte[] byteFileName = Encoding.Unicode.GetBytes(clientObject.FileName[clientObject.NumberOfFiles]);
                byteInfo = new byte[headLength + packageLength + byteCommand.Length + spiltLength + byteFileName.Length];
                bytePackageLength = BitConverter.GetBytes(byteInfo.Length);

                Array.Copy(byteHead, 0, byteInfo, 0, headLength);
                Array.Copy(bytePackageLength, 0, byteInfo, headLength, packageLength);
                Array.Copy(byteCommand, 0, byteInfo, headLength + packageLength, byteCommand.Length);
                Array.Copy(byteSpilt, 0, byteInfo, headLength + packageLength + byteCommand.Length, spiltLength);
                Array.Copy(byteFileName, 0, byteInfo, headLength + packageLength + byteCommand.Length + spiltLength, byteFileName.Length);
                AsynSend(tcpClient, byteInfo);

                clientObject.NumberOfFiles++;
                clientObject.FileStream = null;
                Console.WriteLine("文件总数={0},已收到的文件数={1}",clientObject.FilesNumber,clientObject.NumberOfFiles);
                if (clientObject.FilesNumber != clientObject.NumberOfFiles)
                {
                    clientObject.FileStream = new FileStream(clientObject.FilePath + clientObject.FileName[clientObject.NumberOfFiles], FileMode.Create, FileAccess.Write);                    
                    clientObject.ReceiveBytes = 0;
                    clientObject.CurrentFileSize = clientObject.FileSize[clientObject.NumberOfFiles];
                    socketToUserName[tcpClient] = clientObject;
                }
            }           
        } 
          
        #endregion


现在的问题是,不管的加上红色代码两句中的任何一句,接收的文件都没错,但是不加任何一句的话就出错了 --------------------编程问答--------------------
引用 8 楼 J183754123 的回复:
Thread.Sleep(1);1是毫秒啊,不会多影响传输的时间吧?我一般都是写Thread.Sleep(100)的,就是在等要接收的数据正确的传完

晕,怎么没显示红色。。。就是26行和27行的两句。。。  我的sleep(1)语句是在每处理一个4k大小的数据包就执行一次,这样下来,一个文件会sleep很多的。。 --------------------编程问答-------------------- 除
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,