c#多线程自动更新

willion1985 2010-10-12 08:45:55
各位高手,我写了一个自动更新程序,分为客户端、服务端,只要客户端一登录程序将自动更新客户端文件,但是多台电脑同时登录会优先更新,请问如何可以同时更新,附上代码,请高手帮忙修改下 ,分数不够可以再给!
客户端:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;
using System.Xml;

namespace SystemLanding
{
public partial class DownFileLoad : Form
{
public DownFileLoad()
{
InitializeComponent();
}
string message = "";
//获取系统版本
string language = System.Globalization.CultureInfo.InstalledUICulture.Name.ToUpper().ToString().Trim();
DataBase db = new DataBase();
private IPEndPoint ServerInfo;
private Socket ClientSocket;
private Byte[] MsgBuffer;
private Byte[] MsgSend;
private string Client_info = "";
private string fileinfo = "";
Thread th;
private void DownFileLoad_Load(object sender, EventArgs e)
{
try
{
string Info = Land.UpdateInfo.ToString().Trim();
string[] val = Info.Split('/');
fileinfo = val[1].ToString().Trim();
switch (language)
{
case "ZH-TW":
this.Text = "更新文件程序";
lblall.Text = "文件更新中!請稍等......(總共" + val[0].ToString() + "文件需要更新)";
break;
default:
this.Text = "更新文件程序";
lblall.Text = "文件更新中!请稍等......(总共" + val[0].ToString() + "文件需要更新)";
break;
}
this.Show();
th = new Thread(LoadFile);
th.Start();
}
catch
{
if (language == "ZH-TW")
{
message = "程序更新失敗,請緊急聯繫系統管理員";
}
else
{
message = "程序更新失败,请紧急联系系统管理员";
}
MessageBox.Show(message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}


/// <summary>
/// 更新文件
/// </summary>
private void LoadFile()
{
ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
MsgBuffer = new Byte[1024];
MsgSend = new Byte[65535];
CheckForIllegalCrossThreadCalls = false;
Random TRand = new Random();
Client_info = "用户:" + TRand.Next(10000).ToString();
try
{
/*初始化更新文件總進度條*/
string []val = Land.UpdateInfo.ToString().Trim().Split('/');
int num = Convert.ToInt32(val[0].ToString().Trim());
pball.Maximum = num;
pball.Value = 0;
//服務器IP
String ServerIP = "192.168.10.15";
//文件存放路徑
string filename = "";
ServerInfo = new IPEndPoint(IPAddress.Parse(ServerIP), 11000);
ClientSocket.Connect(ServerInfo);
ClientSocket.Send(Encoding.Unicode.GetBytes(Client_info.ToString()));
Thread.Sleep(5000);
ClientSocket.Send(Encoding.Default.GetBytes(fileinfo.ToString()));
//接收信息字符串
string recvStr = "";
//接收包單位字節大小
Byte[] buff = new Byte[1024];
//接受字節大小
int result;
result = ClientSocket.Receive(buff);
recvStr = recvStr + Encoding.Default.GetString(buff, 0, result);
string[] info = recvStr.ToString().Trim().Split('-');
string[] Xmlstr = Land.XmlInfo.ToString().Trim().Split('/');
ClientSocket.Send(Encoding.Default.GetBytes("StrOK"));
//获取客户端文件XLM
XmlDocument FileInfo = new XmlDocument();
FileInfo.Load(Application.StartupPath + @"\FileXml\FileInfo.xml");
for (int i = 0; i < info.Length; i++)
{
string[] file = info[i].Split(',');
string[] xml = Xmlstr[i].ToString().Trim().Split(',');
string xmlNodeid = xml[0].ToString().Trim();
string xmlVersion = xml[2].ToString().Trim();
string xmlType = xml[1].ToString().Trim();
//文件大小
int filelength = int.Parse(file[0].ToString());
/*當前更新文件進度條初始化*/
int mod=filelength % 1024;
if (mod > 0)
{
pbnow.Maximum = (filelength / 1024)+1;
}
else
{
pbnow.Maximum = filelength / 1024;
}
pbnow.Value = 0;
lblnow.Text = "DownLoading.....(File:" + file[1].ToString().Trim() + ")";
//獲取更新文件存放地址
filename = Application.StartupPath +@"\"+file[1].ToString().Trim();
//當前接收到的文件大小
int NowFileLength = 0;
//接受文件
FileStream fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Write);
while (true)
{
//判斷當前接收到的文件大小是否與文件大小一致
if (NowFileLength == filelength)
{
//發出指令給服務端當期文件接收完成
ClientSocket.Send(Encoding.Default.GetBytes("OK"));
break;
}
//繼續接收文件
else
{
result = ClientSocket.Receive(buff); //接收来自绑定的 Socket 的数据。
fs.Write(buff, 0, result);
NowFileLength = NowFileLength + result;
if (result <= 0)
break;
}
if (pbnow.Value < pbnow.Maximum)
{
pbnow.Value++;
}
}
fs.Close();
//更新本地文件信息
Update_XmlNode(xmlNodeid, xmlVersion, xmlType);
pball.Value++;
}
ClientSocket.Shutdown(SocketShutdown.Both);
//關閉Socket
ClientSocket.Close();
MessageBox.Show("文件下载完成");
landMainForm();

}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "frmReceive::Receive");
Application.Exit();
}
}


/// <summary>
/// 編輯本地文件信息(XML文件)
/// </summary>
/// <param name="Nodeid">文件節點ID</param>
/// <param name="Version">文件當前版本</param>
/// <param name="FileType">文件類型</param>
private void Update_XmlNode(string Nodeid, string Version, string FileType)
{
//获取客户端文件XLM
XmlDocument FileInfo = new XmlDocument();
FileInfo.Load(Application.StartupPath + @"\FileXml\FileInfo.xml");
//客戶端文件信息
XmlNode FileID = FileInfo.SelectSingleNode("//File/" + Nodeid);
//判斷當前文件節點是否存在
if (FileID == null)
{
/*進行新增節點*/
//获取根节点
XmlNode TopNode = FileInfo.SelectSingleNode("File");
//创建文件节点
XmlElement node = FileInfo.CreateElement(Nodeid);
//创建版本信息节点
XmlElement VersionNode = FileInfo.CreateElement("Version");
VersionNode.InnerText = Version;
node.AppendChild(VersionNode);
//创建文件类型节点
XmlElement FileTypeNode = FileInfo.CreateElement("FileType");
FileTypeNode.InnerText = FileType;
node.AppendChild(FileTypeNode);
TopNode.AppendChild(node);
}
else
{
/*進行文件節點相關信息修改*/
//獲取文件類型、幫本信息節點
XmlNode NodeType = FileID.SelectSingleNode("FileType");
XmlNode NodeVsion = FileID.SelectSingleNode("Version");
//修改版本信息
NodeVsion.InnerText = Version;
NodeType.InnerText = FileType;
}
//保存編輯后的文件信息XML
FileInfo.Save(Application.StartupPath + @"\FileXml\FileInfo.xml");
}

private void landMainForm()
{[code=C#]

string landinfo = Land.LandInfo.ToString().Trim();
//取消按鈕
//打開程序主框架(傳入登錄帳號與密碼進行主框架驗證)
Process.Start("ProduceManage.exe", landinfo);
this.Close();
}

private void DownFileLoad_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}

}
}


[code]


...全文
293 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
liushilong2002 2011-04-20
  • 打赏
  • 举报
回复
养成良好的回帖习惯,这也是我想知道的
shen_mu 2010-10-26
  • 打赏
  • 举报
回复
使用socket会不会有防火墙穿透问题?
willion1985 2010-10-12
  • 打赏
  • 举报
回复
我有请教过别人,说要监听用一个端口,发送文件动态创建端口
willion1985 2010-10-12
  • 打赏
  • 举报
回复
我现在是如果有两个用户同时登录,第一个在更新,第二个必须等第一个更新完成后再开始更新,多个以此类推!
damjmk2 2010-10-12
  • 打赏
  • 举报
回复
并行吗...如果用多线程也不好。。用户太多线程也不能开的太多..还是一个一个来比较好
Rock870210 2010-10-12
  • 打赏
  • 举报
回复
不明白楼主什么叫同时更新。每个客户端启动后就自动去找更新配置,然后下载更新就行了。怎么才算同时?
I520WUCHAN 2010-10-12
  • 打赏
  • 举报
回复
学习了,哈哈。。。。
willion1985 2010-10-12
  • 打赏
  • 举报
回复

服务端


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace FileSendServer
{
public partial class SendFile : Form
{
public SendFile()
{
InitializeComponent();
}
//传送文件所在服务器IP
private string clientIP = "";
//传送文件路径
private string filename = "";
private Socket ServerSocket;//服务端运行的SOCKET
private Thread ServerThread;//服务端运行的线程
private Socket[] ClientSocket;//为客户端建立的SOCKET连接
private int ClientNumb;//存放客户端数量
private byte[] MsgBuffer;//存放消息数据
private void Form1_Load(object sender, EventArgs e)
{

clientIP = "192.168.10.15";
filename ="";
//创建客户连接侦测
interception();

}

/// <summary>
/// //创建客户连接侦测
/// </summary>
private void interception()
{
try
{
IPAddress hostIP = Dns.GetHostEntry(clientIP).AddressList[0]; //将主机名或 IP 地址解析为 IPHostEntry 实例。
//将网络端点表示为 IP 地址和端口号。
IPEndPoint ep = new IPEndPoint(hostIP, 11000); //用指定的地址和端口号初始化 IPEndPoint 类的新实例。
ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ServerSocket.Bind(ep);//将SOCKET接口和IP端口绑定
ServerSocket.Listen(10);//开始监听,并且挂起数为10
ServerThread = new Thread(RecieveAccept);//将接受客户端连接的方法委托给线程
ServerThread.Start();//线程开始运行
ClientSocket = new Socket[65535];//为客户端提供连接个数
MsgBuffer = new byte[1024];//消息数据大小
ClientNumb = 0;//数量从0开始统计
CheckForIllegalCrossThreadCalls = false;//不捕获对错误线程的调用


}
catch (SocketException ex)
{
Console.WriteLine(ex.ToString());
}
}


//接受客户端连接的方法
private void RecieveAccept()
{
while (true)
{
ClientSocket[ClientNumb] = ServerSocket.Accept();
//侦测客户端连接
ClientSocket[ClientNumb].BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack), ClientSocket[ClientNumb]);
//连接成功,记录连接信息
this.ClientList.Items.Add(ClientSocket[ClientNumb].RemoteEndPoint.ToString() + "成功连接服务器.");
ClientNumb++;
}
}

/// <summary>
/// 发送文件
/// </summary>
/// <param name="AR"></param>
private void RecieveCallBack(IAsyncResult AR)
{
try
{
Socket RSocket = (Socket)AR.AsyncState;
int REnd = RSocket.EndReceive(AR);
//循环所有客户连接对象
for (int i = 0; i <= ClientNumb; i++)
{
int btyes;
//判断当前是否有连接上
if (ClientSocket[i].Connected)
{
//获取更新文件信息
btyes = ClientSocket[i].Receive(MsgBuffer);
string file = Encoding.Default.GetString(MsgBuffer, 0, btyes);
string[] val = file.Split('-');
string sendfile = "";
for (int h = 0; h < val.Length; h++)
{
//获取文件大小
string filepath=Application.StartupPath+@"\"+val[h].ToString().Trim();
FileStream fl = new FileStream(filepath, FileMode.Open, FileAccess.Read);
int filelength = (int)fl.Length;
if (h == val.Length - 1)
{
sendfile =sendfile+filelength.ToString().Trim() + "," + val[h].ToString().Trim();
}
else
{
sendfile =sendfile+filelength.ToString().Trim() + "," + val[h].ToString().Trim()+"-";
}
}
//发送总文件个数、当前文件大小、文件名含后缀名(字符串形式,以“/”区分)
ClientSocket[i].Send(Encoding.Default.GetBytes(sendfile));
//接收客戶端接受信息的完成指令
btyes = ClientSocket[i].Receive(MsgBuffer);
//獲取指令字符串
string dictate = Encoding.Default.GetString(MsgBuffer, 0, btyes);
//判斷客戶端接收文件信息是否成功
if (dictate == "StrOK")
{
for (int j = 0; j < val.Length; j++)
{
/*发送文件*/
//获取发送文件路径
filename = Application.StartupPath + @"\" + val[j].ToString().ToString();
//文件实例化
FileStream fileSteam = new FileStream(filename, FileMode.Open, FileAccess.Read);
//将发送的文件包切成1024字节的文件包
while (fileSteam.Position < fileSteam.Length)
{
int readSize = fileSteam.Read(MsgBuffer, 0, MsgBuffer.Length);
if (readSize > 0)
{
//发送文件包
ClientSocket[i].Send(MsgBuffer, readSize, SocketFlags.None);
}
}
//接收客戶端收取發送文件完成的指令
btyes = ClientSocket[i].Receive(MsgBuffer);
dictate = Encoding.Default.GetString(MsgBuffer, 0, btyes);
}
ClientSocket[i].Shutdown(SocketShutdown.Both);
ClientSocket[i].Close();
}

}

}
}
catch
{
}

}

private void SendFile_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}
}
}

火柴没帽 2010-10-12
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
mine566 2010-10-12
  • 打赏
  • 举报
回复
来学习了

*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)

http://feiyun0112.cnblogs.com/
cjh200102 2010-10-12
  • 打赏
  • 举报
回复
来学习了

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧