游戏《Minecraft》或其他应用程序 实现 自动更新 客户端版本
本渣又来写(水)博客了。
先说一下,我这个解决方案的安全性并不是企业级的,咱们就是一群穷开服的Minecraft玩家。
如果你要投入到企业级应用(容易被黑客攻击的场景),请自己写,思路凑合看看。不然安全性无法保证!
本程序默认框架版本为.NET Framework 4.5.2,如需更改框架版本请下载文章最后的源码进入VS进行更改。
本解决方案更倾向于 游戏《Minecraft》的客户端更新,而不是企业级的客户端应用。
应用场景:Minecraft服务器的客户端更新、Minecraft整合包的版本更新、或是其他游戏(需要经常更新客户端内文件的)。
其他的游戏、应用程序有需要自动更新,用这个项目也是可以的,不过需要看情况进行重构~
这个项目是重构了某远古的项目。主要提高了.NET Framework,重写部分代码等。(源码最后我会供上来)
本项目使用免费版ESFarmework通信框架,最多支持10人在线更新,如果你想应用到百人的那种高并发大项目(对我来说是大项目)
你需要去使用付费的。
废话不多说,直接上图

上面的是服务端部分,下面是客户端。

将自动更新的解决方案加入到Minecraft启动器里:

就是这个样子。
对于Minecraft的服主来说,这算是一种福音了吧?
以后再也不需要往QQ群里发新的客户端,直接更新客户端目录下的任意文件,删除文件、替换文件都可以~
然后我们谈谈思路。
轻量解决方案:
一些轻量级的更新程序,大都不是传统的C/S结构(客户端+服务端的组合)。 只有更新程序客户端在应用程序客户端上,
然后以get的方法去获取web的版本文件,如果web的版本文件内填写的版本和客户端不相符,就使用web端版本文件的文件包直链更新客户端。
专业解决方案:
采用C/S结构,部署更新程序服务端在自己主机上,更新程序客户端部署在应用程序客户端上。
通过ESFarmework通信系统,进行数据传输。
更新程序客户端从更新程序服务端获取版本信息,然后进行文件更新,若网络出现波动可进行重新连接,并断点续传。
我们当然要用更加花里胡哨的专业解决方案啊~
接下来我们来配置它~
自动更新程序的服务端:

把监听端口Value="xxxxx"改成一个可以被外网连接的端口。
可以去站长工具检查你服务器上的端口的开放状态。
然后双击exe后,是这个样子:

点击文件版本管理:

说明:
服务端程序在启动后会自动检测同级目录下FileFolder文件夹内的文件夹、文件。然后自动添加入更新名单内。
文件夹结构说明: 
看上面那张图,假设你要更新游戏客户端的这个Config文件夹里的Config.xml,那就在自动更新服务端的FileFolder
新建文件夹Config,然后文件夹里扔一个叫Config.xml的同名文件,然后关闭文件版本管理窗口,重新打开。就可以看见这个目录被添加进去了。
然后客户端那边如果再想,就可以更新Config文件夹下的Config.xml了。
.minecraft文件夹下的文件雷同上面的方法,这样就可以更新模组、材质包了。如法炮制去吧。
如果在文件版本管理窗口里点击一个文件,然后并点击删除按钮。那么客户端更新时,也会删除这个文件~。

然后我们说说
这个版本的值,是文件的版本。
比如你有一个233.zip文件,现在版本是1。
然后客户端的233.zip版本是0(也就是没有这个文件)。
更新程序启动后,会更新这个文件,然后把客户端的233.zip版本设置成1。
这样,下一次启动更新程序,服务端版本和客户端版本就一模一样,不会启动更新,避免更新同样的文件。
如果你在更新程序服务端改了233.zip的内容,然后你需要更新这个文件到客户端,那么你需要在文件版本管理内,把版本1改成版本2.
这样下一次客户端就会去更新了。
接下来我们说自动更新程序的客户端:

我们把自动更新程序的客户端放在.minecraft文件夹里面
所有从服务端传输来的文件都在更新程序客户端同级目录的上一层目录。
也就是如下的结构:
更新程序客户端位置: D:\xxxx服务器客户端\.minecraft\
更新后的文件存放位置: D:\xxxx服务器客户端\
这样如果你要更新.minecraft的文件,就需要在更新程序服务端添加.minecraft文件夹,然后在文件夹内添加mods文件夹或是其他文件。
所有从服务端传输来的文件都在更新程序客户端同级目录的上一层目录。
所有从服务端传输来的文件都在更新程序客户端同级目录的上一层目录。
所有从服务端传输来的文件都在更新程序客户端同级目录的上一层目录。
重要的话说三遍!!!
然后我们打开更新程序客户端的配置文件:

服务器IP需要填写IP地址,而不是域名。有的域名无法被解析。
服务器的IP是动态IP怎么办?
如果你的IP是动态的,经常会换。可以使用FRP代理端口映射。
www.natfrp.com
把你的代理服务器域名换成IP写入自动更新客户端配置文件里就可以。

很好,教程差不多就结束了。
下载(源码+直接部署版):
https://github.com/carierx/MRUS-Core


点击这个下载
MRUS.7z是源码,需要Visual Studio打开并进行编译。
MRUS-开包即用版.7z 是直接使用的版本。里面含客户端和服务端。按照上面配置完成后就可以使用。
感谢你耐心看完本帖子。
游戏《Minecraft》或其他应用程序 实现 自动更新 客户端版本的更多相关文章
- 分析nuget源码,用nuget + nuget.server实现winform程序的自动更新
源起 (个人理解)包管理最开始应该是从java平台下的maven开始吧,因为java的开发大多数是基于开源组件开发的,一个开源包在使用时很可能要去依赖其他的开源包,而且必须是特定的版本才可以.以往在找 ...
- Android应用程序的自动更新升级(自身升级、通过tomcat)(转)
Android应用程序的自动更新升级(自身升级.通过tomcat) http://blog.csdn.net/mu0206mu/article/details/7204746 刚入手android一个 ...
- 【实用篇】Android之应用程序实现自动更新功能
我个人用的是友盟提供的自动更新组件,因此在这里只描述如何实用友盟提供的组件来完成程序的自动更新,步骤如下: 1.登录友盟官网,点击注册一个友盟账号. 2.注册成功后将会自动进入到添加新应用界面,选择添 ...
- Windows程序通用自动更新模块(C#,.NET4.5以上)
本通用自动更新模块适合所有Windows桌面程序的自动更新,不论语言,无论Winform还是wpf. 一.工作流程:1. 主程序A调起升级程序B2. B从服务器获取更新程序列表,打印更新信息.3. B ...
- 批量自动更新SVN版本库 - Windows
开发过程中每天都要从SVN代码库里一个一个的update各个项目代码,不仅效率实在是低,也不符合程序员的"懒"精神,由于是在Windows环境做开发,自然就想到了使用bat来实现自 ...
- 程序包需要 NuGet 客户端版本“2.12”或更高版本,但当前的 NuGet 版本为“2.8.50313.46”
由于安装install-package newtonsoft.json 会出现需要 NuGet 客户端版本“2.12”或更高版本来安装,于是换成旧版的newtonsoft.json PM> ...
- CentOS 7 环境下部署 SVN 并实现自动更新(版本库放在Tomcat下)
1.安装 SVN 1.1先检查是否有安装 svn rpm -qa subversion #没有什么显示就说明没有安装过yum remove subversion #如果有安装就运行删除老版本yum i ...
- C#之使用AutoUpdater自动更新客户端
安装NuGet包 在Visio studio中右击解决方案,选择管理NuGet包,搜索安装Autoupdater.NET.Official. 工作简介 从服务器下载包含更新文件的XML文件,从中获取软 ...
- android自动更新软件版本
根据网上的然后小改 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import j ...
随机推荐
- Linux使用注意事项
1.Linux严格区分大小写 2.Linux中所有内容以文件形式保存,包括硬件 3.修改任何设置,若想永久生效,都需要修改配置文件(除非某些发现版已经默认设置为同时修改内存和硬盘数据). 4.Linu ...
- Java练习 SDUT-2253_分数加减法
分数加减法 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 编写一个C程序,实现两个分数的加减法 Input 输入包含多 ...
- 2018-12-25-C#-使用转换语义版本号
title author date CreateTime categories C# 使用转换语义版本号 lindexi 2018-12-25 09:25:41 +0800 2018-06-29 12 ...
- 开发者说:Sentinel 流控功能在 SpringMVC/SpringBoot 上的实践
从用户的视角来感受一个开源项目的成长,是我们推出「开发者说」专栏的初衷,即在开发者进行开源项目选型时,提供更为立体的项目信息.专栏所有内容均来自作者原创/投稿,本文是「开发者说」的第6篇,作者 Jas ...
- oracle函数 SUBSTRB(c1,n1[,n2])
[功能]取子字符串 [说明]多字节符(汉字.全角符等),按2个字符计算 [参数]在字符表达式c1里,从n1开始取n2个字符;若不指定n2,则从第y个字符直到结束的字串. [返回]字符型,如果从多字符右 ...
- @hdu - 5503@ EarthCup
目录 @description@ @solution@ @accepted code@ @details@ @description@ n 个队伍两两之间比赛,保证没有平局. 现在给出 n 个队伍分别 ...
- linux内核分析笔记----中断和中断处理程序
中断还是中断,我讲了很多次的中断了,今天还是要讲中断,为啥呢?因为在操作系统中,中断是必须要讲的.. 那么什么叫中断呢, 中断还是打断,这样一说你就不明白了.唉,中断还真是有点像打断.我们知道linu ...
- Pytorch: 命名实体识别: BertForTokenClassification/pytorch-crf
文章目录基本介绍BertForTokenClassificationpytorch-crf实验项目参考基本介绍命名实体识别:命名实体识别任务是NLP中的一个基础任务.主要是从一句话中识别出命名实体.比 ...
- 【codeforces 520C】DNA Alignment
[题目链接]:http://codeforces.com/contest/520/problem/C [题意] 给你一个函数; 它的作用是评估两个字符串的相似程度; 评估的时候: 保持一个字符串不动, ...
- 如何利用aop的环绕消息处理log, 以及各种坑的记录
如何利用aop的环绕消息处理log, 以及各种坑的记录 本文链接: https://www.cnblogs.com/zizaiwuyou/p/11667423.html 因为项目里有很多地方要打log ...