异步下载byte[]问题,在线等,搞定立即结贴,急急急急急急急

yf370768770 2007-04-18 04:00:17
我在接收端申明了一个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
...全文
167 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yf370768770 2007-04-18
  • 打赏
  • 举报
回复
如果有耐心的人可以看下我的接收源码 谢谢,这样具体些
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)
{ }
}
yf370768770 2007-04-18
  • 打赏
  • 举报
回复
我顶上去~!顶爷
yf370768770 2007-04-18
  • 打赏
  • 举报
回复
这样不行,Array.Copy(allbuf);这里会报错的,因为allbuf不能为空
我这里的具体写发为

//要被复制的参数,被复制的开始索引,目标,目标索引,复制数目
Array.Copy(cs.buff, receivebuf.Length, allbuf, i, cs.buff.Length - receivebuf.Length);
如果在前面allbuf=null,这里复制时就会报错
云涛 2007-04-18
  • 打赏
  • 举报
回复
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(.......); //接收文件
}

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧