.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自动更新程序的更多相关文章

  1. C#.Net版本自动更新程序及3种策略实现

    C#.Net版本自动更新程序及3种策略实现 C/S程序是基于客户端和服务器的,在客户机编译新版本后将文件发布在更新服务器上,然后建立一个XML文件,该文件列举最新程序文件的版本号及最后修改日期.如程序 ...

  2. ASP.NET网站版本自动更新程序及代码[转]

    1.自动更新程序主要负责从服务器中获取相应的更新文件,并且把这些文件下载到本地,替换现有的文件.达到修复Bug,更新功能的目的.用户手工点击更新按钮启动更新程序.已测试.2.环境VS2008,采用C# ...

  3. WPF自动更新程序

    WPF AutoUpdater 描述: WPF+MVVM实现的自动更新程序 支持更新包文件验证(比较文件MD5码) 支持区分x86与x64程序的更新 支持更新程序的版本号 支持执行更新策略 截图: 使 ...

  4. winform自动更新程序实现

    一.问题背景 本地程序在实际项目使用过程中,因为可以操作电脑本地的一些信息,并且对于串口.OPC.并口等数据可以方便的进行收发,虽然现在软件行业看着动不动都是互联网啊啥的,大有Web服务就是高大上的感 ...

  5. C# WINFORM的自动更新程序

    自动更新程序AutoUpdate.exe https://git.oschina.net/victor596jm/AutoUpdate.git 1.获取源码 http://git.oschina.ne ...

  6. winform 通用自动更新程序

    通用自动更新程序 主要功能: 1. 可用于 C/S 程序的更新,集成到宿主主程序非常简单和配置非常简单,或不集成到主程序独立运行. 2. 支持 HTTP.FTP.WebService等多种更新下载方式 ...

  7. .Net自动更新程序GeneralUpdate,适用于wpf,winfrom,控制台应用

    什么是GeneralUpdate: GeneralUpdate是基于.net framwork4.5.2开发的一款(c/s应用)自动升级程序. 第一个版本叫Autoupdate(原博客: WPF自动更 ...

  8. android自动更新程序,安装完以后就什么都没有了,没有出现安装成功的界面的问题

    转载自: http://blog.csdn.net/lovexieyuan520/article/details/9250099 在android软件开发中,总是需要更新版本,所以当有新版本开发的时候 ...

  9. Winfrom强大的自动更新程序

    推荐一:.Net 小型软件自动更新库(SimpAutoUpdater) http://www.fishlee.net/soft/simple_autoupdater/usage.html 下载地址:h ...

随机推荐

  1. 剑指Offer面试题:6.用两个栈实现队列

    一.题目:用两个栈实现队列 题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 原文是使用 ...

  2. JavaScript的前世今生

    和CSS一样,JavaScript在各浏览器下并非完全一致,它所带来的兼容性问题时常困扰着我们,以至于现在“能否处理流行浏览器的兼容性问题”成为了检验一个程序员是否合格的标准之一.了解JavaScri ...

  3. .Net组件程序设计之上下文

    .Net组件程序设计之上下文 在后续篇幅的远程调用的文章里有说到应用程序域,那是大粒度的控制程序集的逻辑存在,那么想对对象的控制又由谁来做主呢?没错了,就是上下文.CLR把应用程序域更细化了,在应用程 ...

  4. Module-Zero之租户管理

    返回<Module Zero学习目录> 开启多租户 租户实体 租户管理者 默认租户 开启多租户 ABP和Module-Zero可以运行多租户或单租户模式.多租户默认是禁用的.我们可以在mo ...

  5. JavaScript中的百变大咖~this

    原文链接:http://www.jeffjade.com/2015/08/03/2015-08-03-javascript-this/ JavaScript作为一种脚本语言身份的存在,因此被很多人认为 ...

  6. Text文档编码识别方法

    Text文档编码识别方法 在做文档读取的时候,时常碰到编码格式不正确的问题,而要怎么样正确识别文档的编码格式,成了很多程序员的一块心病,今天我就要试着治好这块心病,这段代码的浓缩来自上千万文档的数据分 ...

  7. UpdateData(TRUE)与UpdateData(FALSE)的使用

    二者是更新对话框的控件与变量. 1.先要建立对应关系 如 编辑框IDC_Edit  和 变量 m_name DDX_Text(pDX, IDC_EDIT, m_name); 2.若是在编辑框输入名字 ...

  8. 模拟jsonp的实现

    function prescript(s) { if (s.cache === undefined) { s.cache = false; } if (s.crossDomain) { s.type ...

  9. 前端MVC框架Backbone 1.1.0源码分析(二) - 模型

    模型是什么? Models are the heart of any JavaScript application, containing the interactive data as well a ...

  10. OpenCascade Primitives BRep-Cone

    OpenCascade Primitives BRep-Cone eryar@163.com Abstract. BRep is short for Boundary Representation. ...