实例介绍
【实例简介】
1.将OAUS.Server放在服务器上,开通端口号。
2.将OAUS.Server文件下的OAUS.Server.exe.config配置文件中的端口号更改为开通的端口号。
3.在FileFolder文件下存放需要升级的文件
4.将AutoUpdater放在客户端
5.在AutoUpdater文件下更改AutoUpdater.exe.config配置文件中的ip地址及端口号、可执行程序的exe名称
6.双击AutoUpdater.exe实现从服务器下载文件到与AutoUpdater同一级
【实例截图】
客户端:
服务端:
【核心代码】
using System; using System.Collections.Generic; using System.Text; using ESBasic; using OAUS.Core; using ESPlus.Rapid; using ESPlus.Serialization; using ESPlus.FileTransceiver; using System.IO; using ESBasic.Loggers; using ESPlus.Application.Basic; using System.Threading; namespace AutoUpdater { public class Updater { private bool stoped = false; private FileAgileLogger logger = new FileAgileLogger(AppDomain.CurrentDomain.BaseDirectory "UpdateLog.txt"); private IRapidPassiveEngine rapidPassiveEngine; private UpdateConfiguration updateConfiguration = new UpdateConfiguration(); private int fileCount = 0; //要升级的文件个数。 private int haveUpgradeCount = 0; //已经升级的文件个数。 private IList<FileUnit> removedFileList; //将被删除的文件个数。 private IList<string> downLoadFileRelativeList; //需要升级的所有文件的相对路径 的列表。 private string appDirPath; public event CbGeneric<int> ToBeUpdatedFilesCount; public event CbGeneric UpdateStarted; public event CbGeneric<int, string, ulong> FileToBeUpdated; public event CbGeneric<ulong, ulong> CurrentFileUpdatingProgress; public event CbGeneric<string> UpdateDisruptted; public event CbGeneric UpdateCompleted; public event CbGeneric ConnectionInterrupted; /// <summary> /// 重连成功后,开始续传。 /// </summary> public event CbGeneric UpdateContinued; public Updater(string serverIP, int serverPort) { this.UpdateStarted = new CbGeneric(Updater_UpdateStarted); this.UpdateDisruptted = new CbGeneric<string>(Updater_UpdateDisruptted); this.UpdateCompleted = new CbGeneric(Updater_UpdateCompleted); DirectoryInfo dir = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory); this.appDirPath = dir.Parent.FullName "\\"; this.rapidPassiveEngine = RapidEngineFactory.CreatePassiveEngine(); this.rapidPassiveEngine.AutoReconnect = true; Random random = new Random(); //初始化引擎并登录,返回登录结果 bool canLogon = false; for (int i = 0; i < 100; i ) { string userid = random.Next(1000000).ToString("00000"); LogonResponse logonResponse = rapidPassiveEngine.Initialize(userid, "", serverIP, serverPort, null); if (logonResponse.LogonResult == LogonResult.Succeed) { canLogon = true; break; } } if (!canLogon) { throw new Exception("Failed to connect OAUS server !"); } this.rapidPassiveEngine.ConnectionInterrupted = new CbGeneric(rapidPassiveEngine_ConnectionInterrupted); this.rapidPassiveEngine.RelogonCompleted = new CbGeneric<LogonResponse>(rapidPassiveEngine_RelogonCompleted); } void rapidPassiveEngine_RelogonCompleted(LogonResponse res) { if (res.LogonResult == LogonResult.Succeed) { this.DownloadNextFile(); this.logger.LogWithTime("重连成功,开始续传!"); if (this.UpdateContinued != null) { this.UpdateContinued(); } return; } this.logger.LogWithTime("重连失败!"); if (this.UpdateDisruptted != null) { this.UpdateDisruptted(FileTransDisrupttedType.SelfOffline.ToString()); } } void rapidPassiveEngine_ConnectionInterrupted() { if (this.ConnectionInterrupted != null) { this.ConnectionInterrupted(); } this.logger.LogWithTime("连接断开,正在重连!"); } void Updater_UpdateCompleted() { this.logger.LogWithTime("Update completed!"); } void Updater_UpdateDisruptted(string fileTransDisrupttedType) { this.logger.LogWithTime(string.Format("Update Failed!Cause:{0}。", fileTransDisrupttedType)); } void Updater_UpdateStarted() { this.logger.LogWithTime(string.Format("Update starting. There is {0} files to be updated ......", this.fileCount)); } public void Start() { //配置文件中记录着各个文件的版本信息。 if (!File.Exists(UpdateConfiguration.ConfigurationPath)) { this.updateConfiguration.Save(); } else { this.updateConfiguration = (UpdateConfiguration)UpdateConfiguration.Load(UpdateConfiguration.ConfigurationPath); } //启动升级线程 CbGeneric cb2 = new CbGeneric(this.UdpateThread); cb2.BeginInvoke(null, null); } private void UdpateThread() { try { this.GetUpdateInfo(out this.downLoadFileRelativeList, out this.removedFileList); this.fileCount = this.downLoadFileRelativeList.Count; if (this.ToBeUpdatedFilesCount != null) { this.ToBeUpdatedFilesCount(this.fileCount); } if (this.fileCount == 0 && this.removedFileList.Count == 0) { return; } if (this.UpdateStarted != null) { this.UpdateStarted(); } this.rapidPassiveEngine.FileOutter.FileRequestReceived = new ESPlus.Application.FileTransfering.CbFileRequestReceived(fileOutter_FileRequestReceived); this.rapidPassiveEngine.FileOutter.FileReceivingEvents.FileTransStarted = new CbGeneric<TransferingProject>(FileReceivingEvents_FileTransStarted); this.rapidPassiveEngine.FileOutter.FileReceivingEvents.FileTransCompleted = new ESBasic.CbGeneric<TransferingProject>(FileReceivingEvents_FileTransCompleted); this.rapidPassiveEngine.FileOutter.FileReceivingEvents.FileTransDisruptted = new CbGeneric<TransferingProject, FileTransDisrupttedType>(FileReceivingEvents_FileTransDisruptted); this.rapidPassiveEngine.FileOutter.FileReceivingEvents.FileTransProgress = new CbFileSendedProgress(FileReceivingEvents_FileTransProgress); if (downLoadFileRelativeList.Count > 0) { DownloadFileContract downLoadFileContract = new DownloadFileContract(); downLoadFileContract.FileName = this.downLoadFileRelativeList[0]; //请求下载第一个文件 this.rapidPassiveEngine.CustomizeOutter.Send(InformationTypes.DownloadFiles, CompactPropertySerializer.Default.Serialize<DownloadFileContract>(downLoadFileContract)); } else { //仅仅只有删除文件 if (this.removedFileList.Count > 0) { foreach (FileUnit file in this.removedFileList) { ESBasic.Helpers.FileHelper.DeleteFile(this.appDirPath file.FileRelativePath); } this.updateConfiguration.Save(); if (this.UpdateCompleted != null) { this.UpdateCompleted(); } } } } catch (Exception ee) { this.logger.Log(ee, "AutoUpdater.Updater.UdpateThread", ErrorLevel.High); if (this.UpdateDisruptted != null) { this.UpdateDisruptted(FileTransDisrupttedType.InnerError.ToString()); } } } /// <summary> /// 与服务器的最新版本进行比较,获取要升级的所有文件信息。 /// </summary> private void GetUpdateInfo(out IList<string> downLoadFileNameList, out IList<FileUnit> removeFileNameList) { byte[] lastUpdateTime = rapidPassiveEngine.CustomizeOutter.Query(InformationTypes.GetLastUpdateTime, null); LastUpdateTimeContract lastUpdateTimeContract = CompactPropertySerializer.Default.Deserialize<LastUpdateTimeContract>(lastUpdateTime, 0); downLoadFileNameList = new List<string>(); removeFileNameList = new List<FileUnit>(); if (this.updateConfiguration.ClientVersion != lastUpdateTimeContract.ClientVersion) { //获取文件版本信息列表 byte[] fileInfoBytes = rapidPassiveEngine.CustomizeOutter.Query(InformationTypes.GetAllFilesInfo, null); FilesInfoContract contract = CompactPropertySerializer.Default.Deserialize<FilesInfoContract>(fileInfoBytes, 0); foreach (FileUnit file in this.updateConfiguration.FileList) { FileUnit fileAtServer = ContainsFile(file.FileRelativePath, contract.AllFileInfoList); if (fileAtServer != null) { if (file.Version < fileAtServer.Version) { downLoadFileNameList.Add(file.FileRelativePath); } } else { removeFileNameList.Add(file); } } foreach (FileUnit file in contract.AllFileInfoList) { FileUnit fileAtServer = ContainsFile(file.FileRelativePath, this.updateConfiguration.FileList); if (fileAtServer == null) { downLoadFileNameList.Add(file.FileRelativePath); } } this.updateConfiguration.FileList = contract.AllFileInfoList; this.updateConfiguration.ClientVersion = lastUpdateTimeContract.ClientVersion; } } private FileUnit ContainsFile(string fileName, IList<FileUnit> fileObjects) { foreach (FileUnit file in fileObjects) { if (file.FileRelativePath == fileName) { return file; } } return null; } //服务端要发送某个新版本的文件给客户端时,准备开始接收文件。 void fileOutter_FileRequestReceived(string projectID, string senderID, string fileName, ulong totalSize, ResumedProjectItem resumedFileItem, string comment) { string relativePath = comment; string localSavePath = AppDomain.CurrentDomain.BaseDirectory "temp\\" relativePath; this.EnsureDirectoryExist(localSavePath); //准备开始接收文件 this.rapidPassiveEngine.FileOutter.BeginReceiveFile(projectID, localSavePath,true); } void FileReceivingEvents_FileTransStarted(TransferingProject transferingProject) { if (this.FileToBeUpdated != null) { this.FileToBeUpdated(this.haveUpgradeCount, transferingProject.ProjectName, transferingProject.TotalSize); } } void FileReceivingEvents_FileTransProgress(string fileID, ulong total, ulong transfered) { if (this.CurrentFileUpdatingProgress != null) { this.CurrentFileUpdatingProgress(total, transfered); } } #region FileReceivingEvents_FileTransDisruptted void FileReceivingEvents_FileTransDisruptted(TransferingProject transmittingFileInfo, FileTransDisrupttedType fileTransDisrupttedType) { if (fileTransDisrupttedType == FileTransDisrupttedType.SelfOffline) { return; } //删除已经更新的文件 string sourcePath = AppDomain.CurrentDomain.BaseDirectory "temp\\"; ESBasic.Helpers.FileHelper.DeleteDirectory(sourcePath); if (this.UpdateDisruptted != null) { this.UpdateDisruptted(fileTransDisrupttedType.ToString()); } } #endregion private void DownloadNextFile() { if (this.haveUpgradeCount >= this.fileCount) { return; } DownloadFileContract downLoadFileContract = new DownloadFileContract(); downLoadFileContract.FileName = this.downLoadFileRelativeList[this.haveUpgradeCount]; //请求下载下一个文件 this.rapidPassiveEngine.CustomizeOutter.Send(InformationTypes.DownloadFiles, CompactPropertySerializer.Default.Serialize<DownloadFileContract>(downLoadFileContract)); } #region FileReceivingEvents_FileTransCompleted void FileReceivingEvents_FileTransCompleted(TransferingProject obj) { try { this.haveUpgradeCount ; if (this.haveUpgradeCount < this.fileCount) { this.DownloadNextFile(); } else //所有文件都升级完毕 { //copy文件,删除temp文件夹 string sourcePath = AppDomain.CurrentDomain.BaseDirectory "temp\\"; foreach (string fileRelativePath in this.downLoadFileRelativeList) { string sourceFile = sourcePath fileRelativePath; string destFile = this.appDirPath "\\" fileRelativePath; this.EnsureDirectoryExist(destFile); File.Copy(sourceFile, destFile, true); } ESBasic.Helpers.FileHelper.DeleteDirectory(sourcePath); //删除多余的文件 foreach (FileUnit file in this.removedFileList) { ESBasic.Helpers.FileHelper.DeleteFile(this.appDirPath file.FileRelativePath); } this.updateConfiguration.Save(); if (this.UpdateCompleted != null) { this.UpdateCompleted(); } } } catch (Exception ee) { this.logger.Log(ee, "AutoUpdater.Updater.UdpateThread", ErrorLevel.High); if (this.UpdateDisruptted != null) { this.UpdateDisruptted(FileTransDisrupttedType.InnerError.ToString()); } } } #endregion private void EnsureDirectoryExist(string filePath) { int index = filePath.LastIndexOf("\\"); string dir = filePath.Substring(0, index 1); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } } } }
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论