使用C#开发一个简单的P2P应用

亚美知一

亚美知一

2016-02-19 16:59

今天图老师小编要跟大家分享使用C#开发一个简单的P2P应用,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

  本篇文章讨论了一种设计P2P网络应用程序的简单方法。

  尽管有许多P2P网络不需要索引服务器或中央服务器,各客户机之间可以互相直接通讯,但下面的图1还是显示了P2P网络的基本工作原理,一般来说,P2P概念中包含一台中央索引服务器,这台服务器并不存储有任何文件,它只存储有登录到该网络上的所有用户的信息、客户端的IP地址以及用户提供的供共享的文件,客户机和服务器使用简单的命令通过报路连接进行通讯。

  当客户端A想要查找P2P网络上其他客户端提供共享的文件时,系统会执行下面的操作:

  客户端A以自己的用户名登录到索引服务器上。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  客户端A向服务器注册自己想提供给其他用户共享的文件,以便其他用户能够查找到这些文件。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  客户端A向服务器发出申请,查找与一定的输入模式相匹配的文件。

  索引服务器在其数据库中搜索给定的文件名,并将搜索到的如下的结果返回给客户端A:

  提供该文件的客户端,例如客户端B。

  该用户的IP地址。

  它搜索到的文件名。

一旦客户端A选择了下载选项,客户端A就使用搜索返回的IP地址与客户端B建立连接。

  一旦成功地建立起一个连接,就可以通知对方开始发送文件了。

  下载完成后,应当向索引服务器注册你得到的共享文件的拷贝。

  这样的P2P网络可以用来共享任何类型的文件,它既可以用在局域网上,也可以作在互联网上。

  (图1)

  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());}}}}

展开更多 50%)
分享

猜你喜欢

使用C#开发一个简单的P2P应用

编程语言 网络编程
使用C#开发一个简单的P2P应用

使用C#开发一个简单的P2P应用

编程语言 网络编程
使用C#开发一个简单的P2P应用

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

投资P2P平台有哪些风险 如何选择一个好的P2P平台

理财小知识
投资P2P平台有哪些风险 如何选择一个好的P2P平台

什么是P2P信贷 P2P信贷的定义

理财小知识 理财
什么是P2P信贷 P2P信贷的定义

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

p2p金融是什么?p2p金融公司

生活常识
p2p金融是什么?p2p金融公司

如何选择一个好的P2P网贷平台

理财 理财小知识
如何选择一个好的P2P网贷平台

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Ajax并不神秘揭下各种Ajax控件和类库的小裤衩

Ajax并不神秘揭下各种Ajax控件和类库的小裤衩

包涵HTML标记的内容分页

包涵HTML标记的内容分页
下拉加载更多内容 ↓