作者: 刘彦青

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

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

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

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

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

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

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

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

    ·该用户的IP地址。

    ·它搜索到的文件名。

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

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

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

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

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



}

使用C#开发一个简单的P2P应用的更多相关文章

  1. 如何开发一个简单的HTML5 Canvas 小游戏

    原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ...

  2. 一个简单的P2P传输程序

    写了一个简单的P2P传输程序,在P2P的圈子中传输文件,不过为了简便,这个程序没有真正的传输文件,只是简单的判断一下文件的位置在哪里.这个程序可以处理当有一个peer闪退的情况,在这种情况下,剩下的p ...

  3. 重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务

    [源码下载] 重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后 ...

  4. Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状)

    Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状) 本篇博客来给大家介绍怎样使用Lua这门语言来开发一个简单的小游戏-记数字踩白块. 游戏的流程是这种:在界面上生成5个数1~5字并显 ...

  5. Python开发一个简单的BBS论坛

    项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...

  6. 作业1开发一个简单的python计算器

    开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568 ...

  7. django学习-11.开发一个简单的醉得意菜单和人均支付金额查询页面

    1.前言 刚好最近跟技术部门的[产品人员+UI人员+测试人员],组成了一桌可以去公司楼下醉得意餐厅吃饭的小team. 所以为了实现这些主要点餐功能: 提高每天中午点餐效率,把点餐时间由20分钟优化为1 ...

  8. 自己动手模拟开发一个简单的Web服务器

    开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...

  9. 【UI插件】开发一个简单日历插件(上)

    前言 最近开始整理我们的单页应用框架了,虽然可能比不上MVVM模式的开发效率,也可能没有Backbone框架模块清晰,但是好歹也是自己开发出来 而且也用于了这么多频道的东西,如果没有总结,没有整理,没 ...

随机推荐

  1. Markdown,你只需要掌握这几个

    目录 题记 正文 1. 常用标记 这是一级标题 这是二级标题 这是三级标题 这是高阶标题(效果和一级标题一样 ) 这是次阶标题(效果和二级标题一样) 2. 次常用标记 3. 不常用标记 4. 专项使用 ...

  2. 并发编程(二):全视角解析volatile

    一.目录 1.引入话题-发散思考 2.volatile深度解析 3.解决volatile原子性问题 4.volatile应用场景 二.引入话题-发散思考 public class T1 { /*vol ...

  3. word如何插入和删除脚注,尾注

    在我们日常使用word时,经常会使用到脚注/尾注来对文中某些文字或内容进行注释或是重点说明,效果挺好,挺直观和明显.但是很多人并不会使用,特别是当需要删除脚注事,就特别苦恼了,那根小横线怎么也删除不掉 ...

  4. centos安装tomcat7

    转自:http://www.cnblogs.com/sixiweb/archive/2012/11/26/2789458.html 安装tomcat7: tomcat7下载主页: http://tom ...

  5. (转)java并发编程--Executor框架

    本文转自https://www.cnblogs.com/MOBIN/p/5436482.html java并发编程--Executor框架 只要用到线程,就可以使用executor.,在开发中如果需要 ...

  6. iPhone/iPad各种文件路径详解 帮助了解自己的iphone和ipad

    以下内容皆为转载分享iPhone里重要的目录路径有哪几个? 1. /private/var/mobile 新刷完的机器,要在这个文件夹下建一个Documents的目录,很多程序都要用到. 2. /pr ...

  7. Ioc:autofac lifetime scope.

    During application execution, you’ll need to make use of the components you registered. You do this ...

  8. Ioc:The basic pattern for integrating Autofac into your application

    The basic pattern for integrating Autofac into your application is: Structure your app with inversio ...

  9. rtsp实现的开源代码

    * live.com   C/S   C++   http://www.live555.com * darwin     S     C++   http://www.opensource.apple ...

  10. 移动环境下DNS解析失败后的优化方案

    我们手机游戏中,通过上报收集到的数据来分析,发现相当多的一部分用户,在请求一些配置时会遇到无法解析的情况,或者域名的解析直接被拦截了. 特别是游戏的补丁包文件(放在CDN上),遇到的域名解析失败是最多 ...