C#开发p2p

canca18年前 (2006-11-05)C#340
尽管有许多P2P网络不需要索引服务器或中央服务器,各客户机之间可以互相直接通讯,但下面的图1还是显示了P2P网络的基本工作原理,一般来说,P2P概念中包含一台中央索引服务器,这台服务器并不存储有任何文件,它只存储有登录到该网络上的所有用户的信息、客户端的IP地址以及用户提供的供共享的文件,客户机和服务器使用简单的命令通过报路连接进行通讯。 
   
     当客户端A想要查找P2P网络上其他客户端提供共享的文件时,系统会执行下面的操作: 
   
      ·客户端A以自己的用户名登录到索引服务器上。 
   
      ·客户端A向服务器注册自己想提供给其他用户共享的文件,以便其他用户能够查找到这些文件。 
   
      ·客户端A向服务器发出申请,查找与一定的输入模式相匹配的文件。 
   
      ·索引服务器在其数据库中搜索给定的文件名,并将搜索到的如下的结果返回给客户端A: 
   
       ·提供该文件的客户端,例如客户端B。 
   
       ·该用户的IP地址。 
   
       ·它搜索到的文件名。 
   
   
   
   
     一旦客户端A选择了下载选项,客户端A就使用搜索返回的IP地址与客户端B建立连接。 
   
      ·一旦成功地建立起一个连接,就可以通知对方开始发送文件了。 
   
      ·下载完成后,应当向索引服务器注册你得到的共享文件的拷贝。 
   
     这样的P2P网络可以用来共享任何类型的文件,它既可以用在局域网上,也可以作在互联网上。

C开发p2p - Canca Torvals - Ant Software Studio

C#语言由于其对网络功能良好的支持,特别是内置地支持TCPListener和TCPClient这二个类,使得利用它开发P2P应用程序变得非常容易。下面就是一个使用C#开发的P2P应用的例子: 
   
   public MyTcpListener(int port) : base(port) 
   { 
   
   } 
   public void StopMe() 
   { 
   if ( this.Server != null ) 
   { 
   this.Server.Close(); 
   } 
   } 
   } 
   
   public class Transfer 
   { 
   MyTcpListener tcpl; 
   
   public Transfer() 
   { 
   OptionsLoader ol = new OptionsLoader(); 
   int port = 8081; 
   if (ol.Port > 0) 
   { 
   port = ol.Port; 
   } 
   else 
   { 
   port = 8081; 
   } 
   
   this.tcpl = new MyTcpListener(port); 
   } 
   
   public void TransferShutdown() 
   { 
   tcpl.StopMe(); 
   } 
   
   public void ListenForPeers() 
   { 
   try 
   { 
   
   Encoding ASCII = Encoding.ASCII; 
   
   
   tcpl.Start(); 
   
   
   while (true) 
   { 
   // 在有连接之前,Accept将处于阻塞状态 
   Socket s = tcpl.AcceptSocket(); 
   NetworkStream DataStream = new NetworkStream(s); 
   
   String filename; 
   Byte[] Buffer = new Byte[256]; 
   DataStream.Read(Buffer, 0, 256); 
   filename = Encoding.ASCII.GetString(Buffer); 
   StringBuilder sbFileName = new StringBuilder(filename); 
   StringBuilder sbFileName2 = sbFileName.Replace("\", "\\"); 
   FileStream fs = new FileStream(sbFileName2.ToString(), FileMode.Open, FileAccess.Read); 
   BinaryReader reader = new BinaryReader(fs); 
   byte[] bytes = new byte[1024]; 
   int read; 
   while((read = reader.Read(bytes, 0, bytes.Length)) != 0) 
   { 
   DataStream.Write(bytes, 0, read); 
   } 
   reader.Close(); 
   DataStream.Flush(); 
   DataStream.Close(); 
   } 
   } 
   catch(SocketException ex) 
   { 
   MessageBox.Show(ex.ToString()); 
   } 
   } 
   
   public void DownloadToClient(String server, string remotefilename, string localfilename) 
   { 
   try 
   { 
   TcpClient tcpc = new TcpClient(); 
   Byte[] read = new Byte[1024]; 
   
   OptionsLoader ol = new OptionsLoader(); 
   int port = 0; 
   if (ol.Port > 0) 
   { 
   port = ol.Port; 
   } 
   else 
   { 
   // 缺省的端口号,可以设置为使用的端口号 
   port = 8081; 
   } 
   
   
   // 尝试与服务器连接 
   IPHostEntry IPHost = Dns.Resolve(server); 
   string []aliases = IPHost.Aliases; 
   IPAddress[] addr = IPHost.AddressList; 
   
   IPEndPoint ep = new IPEndPoint(addr[0], port); 
   tcpc.Connect(ep); 
   
   // 获得流对象 
   Stream s = tcpc.GetStream(); 
   Byte[] b = Encoding.ASCII.GetBytes(remotefilename.ToCharArray()); 
   s.Write( b, 0, b.Length ); 
   int bytes; 
   FileStream fs = new FileStream(localfilename, FileMode.OpenOrCreate); 
   BinaryWriter w = new BinaryWriter(fs); 
   
   // 读取流对象,并将其转换为ASCII码 
   while( (bytes = s.Read(read, 0, read.Length)) != 0) 
   { 
   w.Write(read, 0, bytes); 
   read = new Byte[1024]; 
   } 
   
   tcpc.Close(); 
   w.Close(); 
   fs.Close(); 
   } 
   catch(Exception ex) 
   { 
   throw new Exception(ex.ToString()); 
   } 
   } 
   } 
   } 

相关文章

MD5加密C#实现

//此版本支持16位与32位的程序...//CopyRight(C) CAnca Software Office.//Created by CAnca...

C#字符输出格式控制

  C#的String.Format举例stringstr1 =string.Format("{0:N1}",56789);     &n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。