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(.......); //接收文件
}
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(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)
{ }
}