.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. Copy 与MutableCopy的区别

    NSString *string = @"origion"; NSString *stringCopy = [string copy]; NSMutableString *stri ...

  2. Qt Disable QDebug And Warning Output

    如何禁止qDebug的输出 在项目开发的过程中,为了开发方便,我们常常在Qt的Application Output中输出一些内容,慢慢的. 有些qDebug就会被我们遗忘再角落里. 虽然对整个程序影响 ...

  3. 说说设计模式~大话目录(Design Pattern)

    回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...

  4. MongoDB 之C#实践

    官方驱动:https://github.com/mongodb/mongo-csharp-driver/downloads.下载后,还提供了一个酷似msdn的帮助文档. samus驱动:https:/ ...

  5. Laravel 5.3 请求处理管道详解

    对于一个Web应用来说,在一个请求真正处理前,我们可能会对请求做各种各样的判断,然后才允许后续处理. 我们通常的做法: Script 01.php Script 02.php 优点:直观,容易理解 缺 ...

  6. c# 文件属性读取操作及文件之间操作

    c# 获取文件最后修改日期代码FileInfo f = new FileInfo(@"c:\1.txt");Console.WriteLine(f.LastWriteTime.To ...

  7. VS无法设置断点的解决方案

    第一种情况的处理 第二种情况的处理

  8. 外接程序“VMDebugger”未能加载或者导致了异常。是否希望移除该外接程序?

    收工~

  9. C标准I/O库函数与Unbuffered I/O函数

    一.C标准I/O库函数.Unbuffered I/O函数 1. C标准I/O库函数是如何用系统调用的 fopen(3) 调用open(2)打开制定的文件,返回一个文件描述符(一个int类型的编号),分 ...

  10. Android仿微信拍摄短视频

    近期做项目需要添加上传短视频功能,功能设置为类似于微信,点击开始拍摄,设置最长拍摄时间,经过研究最终实现了这个功能,下面就和大家分享一下,希望对你有帮助. 1.视频录制自定义控件: /** * 视频播 ...