《C# TCP发送消息和传输96571.doc》由会员分享,可在线阅读,更多相关《C# TCP发送消息和传输96571.doc(7页珍藏版)》请在金锄头文库上搜索。
1、C# TCP发送消息和传输文件96571本文由zhangzh2003贡献 doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 【背景】 最近做了一个双机备份,就是服务器上有个文件夹,会接收客户端传来的文件,而我们要 做的就是同步这台服务器和另一台备用服务器上的文件. 为了实现这个功能我们使用的 tcp 点对点传输. 【开发环境】 VS2005 【实现原理】 要实现同步要解决两个问题,一个是获取本地服务器上上传上来的文件,二是实现两台机 器间的文件传输. 第一个问题我们用的 FileSystemWatcher 这个可以监视指定文件夹下的文件变动,然 后我们把变动
2、的文件信息记录到数据库,在指定的时间间隔后同步两台机器的文件. 第二个问题我们用的 tcp 文件传输,我们按照一定的原则通过传输消息来告知备份服务 器的要传输的文件名称和大小,然后传输文件. 【代码】 1:FileSystemWatcher 监视文件变动的就不介绍了,很简单的 winform 控件应用. 2:为了完成文件传输,我做了一个 TcpHelper 类库,其中包括 TcpCommon,TcpClientHelper,TcpListenerHelper 三个类,TcpCommon 主要实现了 文件传输时用的一些公共的方法比如发送接收文件,发送接收消息,和文件 hash 的计算 TcpCo
3、mmon using 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; / / 计算文件的 hash 值 / internal string C
4、alcFileHash(string FilePath) MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvid er(); byte hash; using (FileStream fs = new FileStream(FilePath, FileMode. Open, FileAccess.Read, FileShare.Read, 4096) hash = md5.ComputeHash(fs); return BitConverter.ToString(hash); / / 发送文件 / / / / internal boo
5、l SendFile(string filePath, NetworkStream stream) FileStream fs = File.Open(filePath, FileMode.Open); int readLength = 0; byte data = new byte_blockLength; /发送大小 byte length = new byte8; BitConverter.GetBytes(new FileInfo(filePath).Length).Copy To(length, 0); stream.Write(length, 0, 8); /发送文件 while
6、(readLength = fs.Read(data, 0, _blockLength) 0) stream.Write(data, 0, readLength); fs.Close(); return true; / / 接收文件 / / / / internal bool ReceiveFile(string filePath, NetworkStream stre am) try long count = GetSize(stream); if (count = 0) return false; long index = 0; byte clientData = new byte_blo
7、ckLength; if (File.Exists(filePath) File.Delete(filePath); string path=new FileInfo(filePath).Directory.FullName; if (!Directory.Exists(path) Directory.CreateDirectory(path); FileStream fs = File.Open(filePath, FileMode.OpenOrCr eate); try /计算当前要读取的块的大小 int currentBlockLength = 0; if (_blockLength 0
8、 & index count) clientData = new byte_blockLength; receivedBytesLen = 0; if (_blockLength count - index) currentBlockLength = _blockLength; else currentBlockLength = (int)(count - index); receivedBytesLen = stream.Read(clientDat a, 0, currentBlockLength); index += receivedBytesLen; fs.Write(clientDa
9、ta, 0, receivedBytesLen); catch (Exception ex) return false; finally fs.Close(); catch (Exception ex) return false; return true; / / 发送消息 / / / / internal bool SendMessage(string message, NetworkStream strea m) byte data = Encoding.UTF8.GetBytes(message); byte resultData = new byte8 + data.Length; B
10、itConverter.GetBytes(data.Length).CopyTo(resultData, 0); data.CopyTo(resultData, 8); stream.Write(resultData, 0, resultData.Length); return true; / / 读取消息 / / / internal string ReadMessage(NetworkStream stream) string result = ; int messageLength = 0; byte resultbyte = new byte500 * 1024; /读取数据大小 in
11、t index = 0; int count = GetSize(stream); byte data = new bytecount; while (index count & (messageLength = stream.Read(dat a, 0, count - index) != 0) data.CopyTo(resultbyte, index); index += messageLength; result = Encoding.UTF8.GetString(resultbyte, 0, index); return result; / / 获取要读取的数据的大小 / / / p
12、rivate int GetSize(NetworkStream stream) int count = 0; byte countBytes = new byte8; try if (stream.Read(countBytes, 0, 8) = 8) count = BitConverter.ToInt32(countBytes, 0); else return 0; catch (Exception ex) return count; TcpClientHelper using System; using System.Collections.Generic; using System.
13、Text; using System.Net.Sockets; namespace Xpwy.Backup.PTcpHelper public class TcpClientHelper:IDisposable TcpClient client; NetworkStream netstream; string _serverip = 127.0.0.1; int _port = 8080; TcpCommon tcpCommon = new TcpCommon(); #region TcpClientHelper constructor public TcpClientHelper(strin
14、g strServerIP, int serverPort) _serverip = strServerIP; _port = serverPort; #endregion public void Start() client = new TcpClient(_serverip, _port); netstream = client.GetStream(); public void Stop() if (netstream != null) netstream.Close(); if (client != null) client.Close(); #region TcpCommon 所有方法 public string CalcFileHash(string FilePath) return tcp