发送文件,由于是大文件,我建了一个缓冲区,每次把文件的一部分读入缓冲区后发送,在发送之前进行了序列化和加密的操作。
例如 一个文件 1112 字节,序列化后 1140,然后加密后1920字节。我设的缓冲区大小为1024字节 #region 向远程主机发送文件 public static int SendFile(Socket socket, string fileName, int maxBufferLength, int outTime)
/// <param name="socket" >要发送数据且已经连接到远程主机的 socket</param>
/// <param name="fileName">待发送的文件名称</param>
/// <param name="maxBufferLength">文件发送时的缓冲区大小</param>
/// <param name="outTime">发送缓冲区中的数据的超时时间</param>
/// <returns>0:发送文件成功;-1:超时;-2:发送文件出现错误;-3:发送文件出现异常;-4:读取待发送文件发生错误</returns>
/// <res >
/// 当 outTime 指定为-1时,将一直等待直到有数据需要发送
/// </res> static
public static int SendFile(Socket socket, string fileName, int maxBufferLength, int outTime)
{
if (fileName == null || maxBufferLength <= 0)
{
throw new ArgumentException("待发送的文件名称为空或发送缓冲区的大小设置不正确.");
} int flag = 0;
try
{
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
byte[] buffer = null; byte[] bFile = new byte[fs.Length];
BinaryReader r = new BinaryReader(fs);
bFile = r.ReadBytes((int)fs.Length);
r.Close();
r = null;
fs.Close(); #region 发送文件序列化及加密
byte[] bFileSer = null; //用于序列化的数组
byte[] bFileSerDES = null; //用于序列化并加密后的数组
bFileSer = BufferHelper.Serialize(bFile); //序列化
string temp = ConvertByteArrayToString(bFileSer); //byte[]转string
string tempDES = DES.DesEncrypt(temp, "11001100"); //DES加密
bFileSerDES = System.Text.Encoding.Default.GetBytes(tempDES); //序列化及加密后的数组
#endregion int fileLen = bFileSerDES.Length; //数组的长度
int readLen = 0; //已读取部分 if (fileLen <= maxBufferLength)
{
//文件可以一次读取
buffer = new byte[fileLen];
Buffer.BlockCopy(bFileSerDES, 0, buffer, 0, fileLen); //把信息拷贝到buffer数组中 flag = SendData(socket, buffer, outTime);
}
else
{
//循环读取文件,并发送 int number = fileLen / maxBufferLength; //看看需要几个缓冲区可以读完数据
for (int i = 0; i <= number; i++)
{
buffer = new byte[maxBufferLength];
Buffer.BlockCopy(bFileSerDES, readLen * i, buffer, 0, maxBufferLength); flag = SendData(socket, buffer, outTime); if (flag < 0)
{
break;
}
readLen += maxBufferLength;
} }
fs.Close();
}
catch (IOException e)
{
Log.WriteLog(e);
flag = -4;
}
return flag;
}
就是这句报错Buffer.BlockCopy(bFileSerDES, readLen * i, buffer, 0, maxBufferLength);
请高手指教
例如 一个文件 1112 字节,序列化后 1140,然后加密后1920字节。我设的缓冲区大小为1024字节 #region 向远程主机发送文件 public static int SendFile(Socket socket, string fileName, int maxBufferLength, int outTime)
/// <param name="socket" >要发送数据且已经连接到远程主机的 socket</param>
/// <param name="fileName">待发送的文件名称</param>
/// <param name="maxBufferLength">文件发送时的缓冲区大小</param>
/// <param name="outTime">发送缓冲区中的数据的超时时间</param>
/// <returns>0:发送文件成功;-1:超时;-2:发送文件出现错误;-3:发送文件出现异常;-4:读取待发送文件发生错误</returns>
/// <res >
/// 当 outTime 指定为-1时,将一直等待直到有数据需要发送
/// </res> static
public static int SendFile(Socket socket, string fileName, int maxBufferLength, int outTime)
{
if (fileName == null || maxBufferLength <= 0)
{
throw new ArgumentException("待发送的文件名称为空或发送缓冲区的大小设置不正确.");
} int flag = 0;
try
{
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
byte[] buffer = null; byte[] bFile = new byte[fs.Length];
BinaryReader r = new BinaryReader(fs);
bFile = r.ReadBytes((int)fs.Length);
r.Close();
r = null;
fs.Close(); #region 发送文件序列化及加密
byte[] bFileSer = null; //用于序列化的数组
byte[] bFileSerDES = null; //用于序列化并加密后的数组
bFileSer = BufferHelper.Serialize(bFile); //序列化
string temp = ConvertByteArrayToString(bFileSer); //byte[]转string
string tempDES = DES.DesEncrypt(temp, "11001100"); //DES加密
bFileSerDES = System.Text.Encoding.Default.GetBytes(tempDES); //序列化及加密后的数组
#endregion int fileLen = bFileSerDES.Length; //数组的长度
int readLen = 0; //已读取部分 if (fileLen <= maxBufferLength)
{
//文件可以一次读取
buffer = new byte[fileLen];
Buffer.BlockCopy(bFileSerDES, 0, buffer, 0, fileLen); //把信息拷贝到buffer数组中 flag = SendData(socket, buffer, outTime);
}
else
{
//循环读取文件,并发送 int number = fileLen / maxBufferLength; //看看需要几个缓冲区可以读完数据
for (int i = 0; i <= number; i++)
{
buffer = new byte[maxBufferLength];
Buffer.BlockCopy(bFileSerDES, readLen * i, buffer, 0, maxBufferLength); flag = SendData(socket, buffer, outTime); if (flag < 0)
{
break;
}
readLen += maxBufferLength;
} }
fs.Close();
}
catch (IOException e)
{
Log.WriteLog(e);
flag = -4;
}
return flag;
}
就是这句报错Buffer.BlockCopy(bFileSerDES, readLen * i, buffer, 0, maxBufferLength);
请高手指教
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货