发送文件,由于是大文件,我建了一个缓冲区,每次把文件的一部分读入缓冲区后发送,在发送之前进行了序列化和加密的操作。
例如 一个文件 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);
请高手指教