C#之tcp自动更新程序

.NETTCP自动更新程序有如下几步骤:
第一步:服务端开启监听
ServiceHost host;
private void button1_Click(object sender, EventArgs e)
{
host = new ServiceHost(typeof(WCFService.Service));
host.Open();
if (host.State == CommunicationState.Opened)
{
this.button1.Enabled = false;
this.button2.Enabled = true;
}
this.label1.Text = host.State.ToString();
}
第二步:客户端创建服务连接,不多说,大家应该都会
第三步:客户端选择更新文件(包括了一个Read_File)
#region 选择文件按钮
private void btn_SelectFiles_Click(object sender, EventArgs e)
{
dt_updatefile.Clear();
OpenFileDialog File_XuanZe = new OpenFileDialog();
File_XuanZe.Multiselect = true;//允许同时选择多个文件
File_XuanZe.Filter = "Dll files(*.dll)|*.dll|Txt files(*.txt)|*.txt|Access files(*.mdb)|*.mdb|All files(*.*)|*.*";
if (DialogResult.OK == File_XuanZe.ShowDialog())
{
for (int i = ; i < File_XuanZe.FileNames.Length; i++)
{
byte[] buff = Read_File(File_XuanZe.FileNames[i]);
//第三列为版本号 应该设置一个textbox为版本号
//第四列为存放路径 例如图片就在图片文件夹,可执行文件就在根目录下
dt_updatefile.Rows.Add(i + , File_XuanZe.SafeFileNames[i], txt_version.Text, @"\图片\", buff);
}
}
dataGridView1.DataSource = dt_updatefile;
}
#endregion #region 将文件转换成byte[] Read_File
public byte[] Read_File(string str_path)
{
byte[] arrFile = null; //先定义一个byte数组
using (FileStream fs = new FileStream(str_path, FileMode.Open, FileAccess.Read)) //path是文件的路径
{
arrFile = new byte[fs.Length];//定义这个byte[]数组的长度 为文件的length
fs.Read(arrFile, , arrFile.Length);//把fs文件读入到arrFile数组中,0是指偏移量,从0开始读,arrFile.length是指需要读的长度,也就是整个文件的长度
return arrFile;
}
}
#endregion
第四步:上传更新文件,采用数据序列化并压缩后上传
#region 上传文件按钮
private void btn_UpdateFile_Click(object sender, EventArgs e)
{
DataSet ds = new DataSet();
if(dt_updatefile.DataSet != null)
{
dt_updatefile.DataSet.Tables.Remove(dt_updatefile);
}
ds.Tables.Add(dt_updatefile);
client.Update_System(data_Serializer.GetDataSetSurrogateZipBytes(ds));
Load_OldFiles();
dt_updatefile.Clear();
}
#endregion
第五步:服务端接受数据并写文件,修改XML中版本信息
#region 接受客户端发来的更新数据包Update_System
public void Update_System(byte[] byte_files)
{
DataSet ds = data_Serializer.GetZipBytesSurrogateDataSet(byte_files);
//解压成了dataset 循环存放文件,并修改Version_Config.xml中对应的值
DataTable dt = ds.Tables[];
foreach(DataRow dr in dt.Rows)
{
string path = System.AppDomain.CurrentDomain.BaseDirectory + @"\" + dr["Col_Version"] +dr["Col_File_Path"];
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
if (File.Exists(path + dr["Col_File_Name"].ToString()))
{
//存在文件
File.Delete(path + dr["Col_File_Name"].ToString());
}
#region 回写文件 没有排除掉重复文件
//判断此文件是否存在,存在则修改为原文件名+年月日时分秒,不存在就写文件
byte[] buffer = (byte[])dr["Col_File_Size"];
FileStream fs = new FileStream(path + dr["Col_File_Name"].ToString(), FileMode.Create, FileAccess.Write);
Stream stream = new MemoryStream((byte[])dr["Col_File_Size"]);
int count = ;
while ((count = stream.Read(buffer, , buffer.Length)) > )
{
fs.Write(buffer, , count);
}
//清空缓冲区
fs.Flush();
//关闭流
fs.Close();
#endregion
//写文件完成了,现在就是修改xml中的值了
configXml.Update_Xml(dr["Col_File_Name"].ToString(), dr["Col_Version"].ToString(), dr["Col_File_Path"].ToString());
}
}
#endregion
第六步:客户端检测版本号,更新程序
#region 下载文件btn_DownFiles_Click
private void btn_DownFiles_Click(object sender, EventArgs e)
{
System.Xml.XmlDocument xDoc = new System.Xml.XmlDocument();
xDoc.Load(System.Windows.Forms.Application.ExecutablePath + ".config");
System.Xml.XmlNode xNode;
System.Xml.XmlElement xElem1;
xNode = xDoc.SelectSingleNode("//appSettings");
xElem1 = (System.Xml.XmlElement)xNode.SelectSingleNode("//add[@key='version']"); DataSet ds = data_Serializer.GetZipBytesSurrogateDataSet(client.DownFiles(ConfigurationManager.AppSettings["version"]));
DataTable dt_file = ds.Tables[];
//linq
Double maxSV = Creat_Version();
foreach (DataRow dr in dt_file.Rows)
{
string path = System.AppDomain.CurrentDomain.BaseDirectory + dr["Col_File_Path"];
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
if (File.Exists(path + dr["Col_File_Name"].ToString()))
{
//存在文件
File.Delete(path + dr["Col_File_Name"].ToString());
}
#region 回写文件 没有排除掉重复文件
//判断此文件是否存在,存在则修改为原文件名+年月日时分秒,不存在就写文件
byte[] buffer = (byte[])dr["Col_File_Size"];
FileStream fs = new FileStream(path + dr["Col_File_Name"].ToString(), FileMode.Create, FileAccess.Write);
Stream stream = new MemoryStream((byte[])dr["Col_File_Size"]);
int count = ;
while ((count = stream.Read(buffer, , buffer.Length)) > )
{
fs.Write(buffer, , count);
}
//清空缓冲区
fs.Flush();
//关闭流
fs.Close();
#endregion
}
//写文件完成了,现在就是修改xml中的值了
xElem1.SetAttribute("value", maxSV.ToString());
xDoc.Save(System.Windows.Forms.Application.ExecutablePath + ".config");
}
#endregion
大致就是以上步骤。具体中的类等信息没有在代码中贴出,可以下载源代码进行研究。
缺陷:
第一:客户端调用没有判断服务是否开启
第二:文件存放路径还没写完整
第三:暂时自己大脑没想到。
源码下载https://yunpan.cn/cSbKnajf63ptA 访问密码 42ac
C#之tcp自动更新程序的更多相关文章
- C#.Net版本自动更新程序及3种策略实现
C#.Net版本自动更新程序及3种策略实现 C/S程序是基于客户端和服务器的,在客户机编译新版本后将文件发布在更新服务器上,然后建立一个XML文件,该文件列举最新程序文件的版本号及最后修改日期.如程序 ...
- ASP.NET网站版本自动更新程序及代码[转]
1.自动更新程序主要负责从服务器中获取相应的更新文件,并且把这些文件下载到本地,替换现有的文件.达到修复Bug,更新功能的目的.用户手工点击更新按钮启动更新程序.已测试.2.环境VS2008,采用C# ...
- WPF自动更新程序
WPF AutoUpdater 描述: WPF+MVVM实现的自动更新程序 支持更新包文件验证(比较文件MD5码) 支持区分x86与x64程序的更新 支持更新程序的版本号 支持执行更新策略 截图: 使 ...
- winform自动更新程序实现
一.问题背景 本地程序在实际项目使用过程中,因为可以操作电脑本地的一些信息,并且对于串口.OPC.并口等数据可以方便的进行收发,虽然现在软件行业看着动不动都是互联网啊啥的,大有Web服务就是高大上的感 ...
- C# WINFORM的自动更新程序
自动更新程序AutoUpdate.exe https://git.oschina.net/victor596jm/AutoUpdate.git 1.获取源码 http://git.oschina.ne ...
- winform 通用自动更新程序
通用自动更新程序 主要功能: 1. 可用于 C/S 程序的更新,集成到宿主主程序非常简单和配置非常简单,或不集成到主程序独立运行. 2. 支持 HTTP.FTP.WebService等多种更新下载方式 ...
- .Net自动更新程序GeneralUpdate,适用于wpf,winfrom,控制台应用
什么是GeneralUpdate: GeneralUpdate是基于.net framwork4.5.2开发的一款(c/s应用)自动升级程序. 第一个版本叫Autoupdate(原博客: WPF自动更 ...
- android自动更新程序,安装完以后就什么都没有了,没有出现安装成功的界面的问题
转载自: http://blog.csdn.net/lovexieyuan520/article/details/9250099 在android软件开发中,总是需要更新版本,所以当有新版本开发的时候 ...
- Winfrom强大的自动更新程序
推荐一:.Net 小型软件自动更新库(SimpAutoUpdater) http://www.fishlee.net/soft/simple_autoupdater/usage.html 下载地址:h ...
随机推荐
- 更新Literacy
之前都没有做单元测试的啊 昨天离职了,闲着没事做了个单元测试,结果发现一堆问题....大部分都是关于值类型在IL中的操作问题... 这件事让我感觉蛋蛋隐隐发疼....以后一定要做单元测试啊.... 具 ...
- [SDK2.2]Windows Azure Storage (16) 使用WCF服务,将本地图片上传至Azure Storage (上) 客户端代码
<Windows Azure Platform 系列文章目录> 前一章我们完成了服务器端的代码,并且已经发布到了Windows Azure云端. 本章我们将实现客户端的代码,客户端这里我们 ...
- 单独使用jdbc编程问题总结(一)
在学习Mybatis之前,我们先来回顾JDBC编程的相关知识.在此基础上深入的学习Mybatis框架.如有错误,敬请指正. (一)首先我们既然要使用jdbc,当然是要操作数据库了.创建一个名为:myb ...
- Android开发学习之路-下拉刷新怎么做?
因为最近的开发涉及到了网络读取数据,那么自然少不了的就是下拉刷新的功能,搜索的方法一般是自己去自定义ListView或者RecyclerView来重写OnTouch或者OnScroll方法来实现手势的 ...
- 携程App的网络性能优化实践
首先介绍一下携程App的网络服务架构.由于携程业务众多,开发资源导致无法全部使用Native来实现业务逻辑,因此有相当一部分频道基于Hybrid实现.网络通讯属于基础&业务框架层中基础设施的一 ...
- LR中的时间戳函数web_save_timestamp_param
以前真没注意过后面看某个群有人说到这个函数一查,还真有,那么处理时间戳就简单很多了,我们经常在各种网站上看到类似于这样的时间戳 51Testing软件测试网"d bLq!uR&am ...
- Sql Server系列:数据控制语句
数据控制语句用来设置.更改用户或角色的权限,包括GRANT.DENY.REVOKE等语句. GRANT用来对用户授予权限,REVOKE可用于删除已授权的权限,DENY用于防止主体通过GRANT获得特定 ...
- Sql Server系列:流程控制语句
T-SQL中用来编写流程控制模块的语句有:BEGIN...AND语句.IF...ELSE语句.CASE语句.WHILE语句.GOTO语句.BREAK语句.WAITFOR语句和RETURN语句. 1 B ...
- iOS开发之地图与定位
无论是QQ还是微信的移动客户端都少不了定位功能,之前在微信demo中没有添加定位功能,今天就写个定位的小demo来了解一下定位和地图的东西.地图和定位看上去是挺高大上一东西,其实用法比TableVie ...
- Ubuntu杂记——Ubuntu下安装VMware
转战Ubuntu,不知道能坚持多久,但是自己还是要努力把转战过程中的学习到的给记录下来.这次就来记录一下,Ubuntu下如何安装VMware. 就我所知,Linux下有VirtualBox和VMwar ...