| 异步下载byte[]问题 |
| [ 来源:ITWENKU 时间:2007-4-18 16:00:18 | 浏览:298人次
] |
| |
我在接收端申明了一个byte[] allbuf=new byte[2048*1024]的2M缓存 发送端每次发的包是512K,接收端直到每次发过来的包达到allbuf的容量后再写入硬盘,如下: private void ReceiveCallBack(IAsyncResult ar) { allbuf //2M缓存 filebuf //文件字节数组,这时数据已经写如filebuf Array.Copy(allbuf);//简化了写发,我只是想表达意思,这里把文件字节复制到2M缓存 if (token[1] == allbuf.Length.ToString() || allbuf.Length == (2048 *1024) || j==bagnum || allbuf.Length > 2096640) { 写如硬盘 } BeginReceive(.......); //接收文件 } 问题出在这里 allbuf.Length不管接收到多少,他的Length都等于2048*1024,比如只接收到一个512K的包,在IF判断那里我是不会写入硬盘的,只会循环继续复制到allbuf里,但是始终allbuf.Length==2048*1024,因为在接受到512K后allbuf后面以0补充了字节数组allbuf,因为我设置了固定长度给allbuf 为2048*1024
请问各位大虾改怎样解决此事?能不能获取到真真的数据的长度,而不是我申明时的2048*1024
byte[] allbuf=null private void ReceiveCallBack(IAsyncResult ar) { allbuf //2M缓存 filebuf //文件字节数组,这时数据已经写如filebuf Array.Copy(allbuf);//简化了写发,我只是想表达意思,这里把文件字节复制到2M缓存 allbuf=new byte[Array.Length] if (token[1] == allbuf.Length.ToString() || allbuf.Length == (2048 *1024) || j==bagnum || allbuf.Length > 2096640) { 写如硬盘 } BeginReceive(.......); //接收文件 }
这样不行,Array.Copy(allbuf);这里会报错的,因为allbuf不能为空 我这里的具体写发为
//要被复制的参数,被复制的开始索引,目标,目标索引,复制数目 Array.Copy(cs.buff, receivebuf.Length, allbuf, i, cs.buff.Length - receivebuf.Length); 如果在前面allbuf=null,这里复制时就会报错
我顶上去~!顶爷
如果有耐心的人可以看下我的接收源码 谢谢,这样具体些 private void ReceiveCallBack(IAsyncResult ar) { try { Client cs = (Client)ar.AsyncState; int len = ConnSocket.EndReceive(ar);//这个地方的socket有问题,要考虑 if (len != 0) { string msg = System.Text.Encoding.Default.GetString(cs.buff,0,len); string[] token = msg.Split('|'); string filepath = @"D:\我是接收的文件.exe"; if (token[0] == ((int)cmdd.OK).ToString()) { FileStream fs = new FileStream(filepath, FileMode.Append, FileAccess.Write); string cmd = token[0] + "|" + token[1] + "|"; string strok = token[0] + "|"; byte[] receivebuf = System.Text.Encoding.Default.GetBytes(cmd.ToCharArray()); //int baglen=receivebuf.Length + 512*1024;//这是一个包的大小,这里暂时不需要 //发送的时候2M的缓冲区只剩下不到512K的容量了,这时我下面是不会写入数据的,但是又发来一个数据包,缓冲区溢出(再写入地方已经解决此问题) //2048*1024/cs.buff.Length Array.Copy(cs.buff, receivebuf.Length, allbuf, i, cs.buff.Length - receivebuf.Length); allbuf = new byte[allbuf.Length]; i += cs.buff.Length - receivebuf.Length; bagnum = Convert.ToInt32(token[1]) / (512*1024);//这个地方应该是 (文件+命令*包数)/(命令+512*1024),但是经过数学公式成此代码 if (Convert.ToInt32(token[1]) % (512*1024) != 0) { bagnum += 1; } // 当一个文件小与或等于2M时 || 当接收缓冲区allbuf满时 || 当最后一个包发送过来时 || 发送的时候2M的缓冲区只剩下不到512K的容量了,这时是不会写入数据的,但是又发来一个数据包,缓冲区溢出 if (token[1] == allbuf.Length.ToString() || allbuf.Length == (2048 * 1024) || j==bagnum || allbuf.Length > 2096640) {
receivefileDone.Reset(); fs.BeginWrite(allbuf,0, allbuf.Length, new AsyncCallback(writefileCallback), fs); receivefileDone.WaitOne(); j++; i = 0; } //fs.BeginWrite(cs.buff, receivebuf.Length, len - receivebuf.Length, new AsyncCallback(writefileCallback), fs); if (Convert.ToInt32(token[1]) != fs.Length)//当传过来的文件长度不等于我硬盘文件长度就是没传完,发送OK让服务器继续传 { SendToUpServer(cs.ClientSocket, strok); } fs.Flush(); int cc=cs.buff.Length; fs.Close(); } else if (token[0] == ((int)cmdd.ERR).ToString()) { cs.ClientSocket.Close(); } } cs.ClientSocket.BeginReceive(cs.buff, 0, cs.buff.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), cs); } catch (SocketException ex) { if (ex.ErrorCode == 10054) { ConnSocket.Close(); } } catch (ObjectDisposedException) { } }
|
|
 |
最新更新 |
|