- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
【背景】
?????最近做了一个双机备份,就是服务器上有个文件夹,会接收客户端传来的文件,而我们要做的就是同步这台服务器和另一台备用服务器上的文件.
?????为了实现这个功能我们使用的tcp点对点传输.
【开发环境】
?????VS2005
【实现原理】
?????要实现同步要解决两个问题,一个是获取本地服务器上上传上来的文件,二是实现两台机器间的文件传输.
?????第一个问题我们用的FileSystemWatcher这个可以监视指定文件夹下的文件变动,然后我们把变动的文件信息记录到数据库,在指定的时间间隔后同步两台机器的文件.
?????第二个问题我们用的tcp文件传输,我们按照一定的原则通过传输消息来告知备份服务器的要传输的文件名称和大小,然后传输文件.
【代码】
?????1:FileSystemWatcher监视文件变动的就不介绍了,很简单的winform控件应用.
?????2:为了完成文件传输,我做了一个TcpHelper类库,其中包括TcpCommon,TcpClientHelper,TcpListenerHelper三个类,TcpCommon主要实现了文件传输时用的一些公共的方法比如发送接收文件,发送接收消息,和文件hash的计算
TcpCommon
Codeusing?System;using?System.Collections.Generic;using?System.Text;using?System.Security.Cryptography;using?System.IO;using?System.Net.Sockets;namespace?Xpwy.Backup.PTcpHelper{????internal?class?TcpCommon????{????????private?static?readonly?int?_blockLength?=?500?*?1024;????????///?summary????????///?计算文件的hash值?????????///?/summary????????internal?string?CalcFileHash(string?FilePath)????????{????????????MD5CryptoServiceProvider?md5?=?new?MD5CryptoServiceProvider();????????????byte[]?hash;????????????using?(FileStream?fs?=?new?FileStream(FilePath,?FileMode.Open,?FileAccess.Read,?FileShare.Read,?4096))????????????{????????????????hash?=?md5.ComputeHash(fs);????????????}????????????return?BitConverter.ToString(hash);????????}????????///?summary????????///?发送文件????????///?/summary????????///?param?name=filePath/param????????///?param?name=stream/param????????///?returns/returns????????internal?bool?SendFile(string?filePath,?NetworkStream?stream)????????{????????????FileStream?fs?=?File.Open(filePath,?FileMode.Open);????????????int?readLength?=?0;????????????byte[]?data?=?new?byte[_blockLength];????????????//发送大小????????????byte[]?length?=?new?byte[8];????????????BitConverter.GetBytes(new?FileInfo(filePath).Length).CopyTo(length,?0);????????????stream.Write(length,?0,?8);????????????//发送文件????????????while?((readLength?=?fs.Read(data,?0,?_blockLength))??0)????????????{????????????????strea
文档评论(0)