当前位置:首页 > C# > 正文内容

C#开发p2p

canca19年前 (2006-11-05)C#643
尽管有许多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()); 
   } 
   } 
   } 
   } 

扫描二维码推送至手机访问。

版权声明:本文由Ant.Master's Blog发布,如需转载请注明出处。

本文链接:https://iant.work/post/682.html

标签: C#
分享给朋友:
返回列表

没有更早的文章了...

下一篇:MD5加密C#实现

“C#开发p2p” 的相关文章

C sharp 正则表达式整理备忘

有一段时间,正则表达式学习很火热很潮流,当时在CSDN一天就能看到好几个正则表达式的帖子,那段时间借助论坛以及Wrox Press出版的《C#字符串和正则表达式参考手册》学习了一些基础的知识,同时也为我在CSDN大概赚了1000分,今天想起来,去找《C#字符串和正则表达式参考手册》时,已经不知所踪了...

根据两点经纬度计算距离

这些经纬线是怎样定出来的呢?地球是在不停地绕地轴旋转(地轴是一根通过地球南北两极和地球中心的假想线),在地球中腰画一个与地轴垂直的大圆圈,使圈上的每一点都和南北两极的距离相等,这个圆圈就叫作“赤道”。在赤道的南北两边,画出许多和赤道平行的圆圈,就是“纬圈”;构成这些圆圈的线段,叫做纬线。我们把赤道定...

发表评论

访客

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