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

Eileen5677

Eileen5677

2016-02-19 12:26

图老师小编精心整理的使用C#开发一个简单的P2P应用希望大家喜欢,觉得好的亲们记得收藏起来哦!您的支持就是小编更新的动力~

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

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

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

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

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

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

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

    该用户的IP地址。

    它搜索到的文件名。

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

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

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

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


(图1)

 

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

C#语言由于其对网络功能良好的支持,特别是内置地支持TCPListener和TCPClient这二个类,使得利用它开发P2P应用程序变得非常容易。下面就是一个使用C#开发的P2P应用的例子:

 1public MyTcpListener(int port) : base(port)
  2
  3public void StopMe() 
  4{
  5if ( this.Server != null )
  6
  7}
  8}
  9
 10public class Transfer
 11{
 12MyTcpListener tcpl;
 13
 14public Transfer()
 15{
 16OptionsLoader ol = new OptionsLoader(); 
 17int port = 8081;
 18if (ol.Port  0)
 19{
 20port = ol.Port;
 21}
 22else
 23{
 24port = 8081;
 25
 26
 27this.tcpl = new MyTcpListener(port); 
 28}
 29
 30public void TransferShutdown()
 31
 32
 33public void ListenForPeers() 
 34
 35try
 36
 37
 38Encoding ASCII = Encoding.ASCII; 
 39
 40
 41tcpl.Start(); 
 42
 43
 44while (true)
 45
 46// 在有连接之前,Accept将处于阻塞状态
 47Socket s = tcpl.AcceptSocket(); 
 48NetworkStream DataStream = new NetworkStream(s);
 49
 50String filename;
 51Byte[] Buffer = new Byte[256];
 52DataStream.Read(Buffer, 0, 256);
 53filename = Encoding.ASCII.GetString(Buffer);
 54StringBuilder sbFileName = new StringBuilder(filename);
 55StringBuilder sbFileName2 = sbFileName.Replace("", "");
 56FileStream fs = new FileStream(sbFileName2.ToString(), FileMode.Open, FileAccess.Read); 
 57BinaryReader reader = new BinaryReader(fs);
 58byte[] bytes = new byte[1024];
 59int read;
 60while((read = reader.Read(bytes, 0, bytes.Length)) != 0) 
 61{
 62DataStream.Write(bytes, 0, read);
 63}
 64reader.Close(); 
 65DataStream.Flush();
 66DataStream.Close();
 67}
 68}
 69catch(SocketException ex)
 70
 71MessageBox.Show(ex.ToString());
 72}
 73}
 74
 75public void DownloadToClient(String server, string remotefilename, string localfilename) 
 76{
 77try
 78{
 79TcpClient tcpc = new TcpClient(); 
 80Byte[] read = new Byte[1024]; 
 81
 82OptionsLoader ol = new OptionsLoader(); 
 83int port = 0;
 84if (ol.Port  0)
 85{
 86port = ol.Port;
 87}
 88else
 89{
 90// 缺省的端口号,可以设置为使用的端口号
 91port = 8081;
 92
 93
 94
 95// 尝试与服务器连接
 96IPHostEntry IPHost = Dns.Resolve(server); 
 97string []aliases = IPHost.Aliases; 
 98IPAddress[] addr = IPHost.AddressList; 
 99
100IPEndPoint ep = new IPEndPoint(addr[0], port);
101tcpc.Connect(ep);
102
103// 获得流对象
104Stream s = tcpc.GetStream(); 
105Byte[] b = Encoding.ASCII.GetBytes(remotefilename.ToCharArray());
106s.Write( b, 0, b.Length );
107int bytes;
108FileStream fs = new FileStream(localfilename, FileMode.OpenOrCreate);
109BinaryWriter w = new BinaryWriter(fs);
110
111// 读取流对象,并将其转换为ASCII码
112while( (bytes = s.Read(read, 0, read.Length)) != 0) 
113
114w.Write(read, 0, bytes);
115read = new Byte[1024]; 
116
117
118tcpc.Close();
119w.Close();
120fs.Close();
121}
122catch(Exception ex)
123{
124throw new Exception(ex.ToString()); 
125}
126
127}
128
129

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)
展开更多 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刺客新符文搭配推荐

限制window用户安装使用应用程序方法

限制window用户安装使用应用程序方法

nss3.dll文件丢失怎么办?

nss3.dll文件丢失怎么办?
下拉加载更多内容 ↓