visualfoxpro程序:用Visual C#实现P2P应用程序来源: 发布时间:星期三, 2008年12月17日 浏览:2次 评论:0
.前言:
P2P即英文Peer-to-Peer缩写中译为对等互联或点对点技术讲到P2P人们就会想起NapsterNapster让人们认识到了P2P技术威力P2P技术也就通过Napster进入了大多数用户视野Napster音乐文件交换功能是P2P个主要应用P2P技术可以让用户可以直接连接到其他用户计算机进行文件共享和交换同时P2P在深度搜索、分布计算、协同工作等方面也大有用途 简单地说P2P就是种用于区别PC用户的间不经过中继设备直接交换数据或服务技术它允许Internet用户直接使用对方文件每个人可以直接连接到其他用户计算机并进行文件交换而不需要连接到服务器上再进行浏览和下载消除了中间环节P2P技术使得网络上沟通变得更容易、更直接P2P改变了Internet现在以大网站WebSite为中心状态、重返"非中心化"并把权力交还给用户从某种意义上讲P2P体现了Internet本质在网络尚未发展成为现在Web的前网民就是利用所谓"布告板"等渠道彼此直接交换信息和文件 目前Internet存储模式是"内容位于中心"而P2P技术运用将使Internet上内容向边缘移动这将带来以下改变:首先客户不再需要将文件上传到服务器而只需要使用P2P和其他计算机进行共享;其次使用P2P技术计算机不需要固定IP地址和永久Internet连接这使得占有极大比例拨号上网用户也可以享受P2P带来变革 理解P2P技术方面最好思路方法是仔细观察并理解个实际P2P应用C#作为微软.Net战略重要棋子对网络编程提供了很好支持和优化本文就通过个向大家介绍下C#下P2P编程思路方法和实现机理本文这个虽然不是很有用但却很直观地给出了P2P(点对点)编程以及套接口编程些基本知识和概念它是建立在TcpListener以及TcpClient这两个类基础上除外还有相应输入和输出控制实现原理也比较简单但是用到了P2P技术重返"非中心化"基本原则简言的用这个可以在网络中发送、接受信息任何台计算机既可以作为服务器端又可以作为客户端共用到了 4个类:个Listener类(用来监听新连接)、个Sender类(用来发送信息)、个Inputhandler类(用来控制输入)、个Initialize类(用来完成化工作)下面我先给大家介绍下这 4个类最后再给出具体实现思路方法 2.基本类介绍: 1.Listener类: Listener类是用来监听新连接当它个对象被建立并开启后该对象就开始不断监听来自网络中连接请求旦有了个连接请求该对象就设法建立连接并取得它字节流进而转化成串显示在控制台中当个连接结束后该对象就继续进行监听来自网络中连接请求 代码以及注释如下: P2PTest { using ; using .Net.Sockets; using .Threading; public Listener { private Thread th; private TcpListener tcpl; public bool listenerRun = true; //listenerRun为true表示可以接受连接请求false则为结束 public Listener//构造 { th = Thread( ThreadStart(Listen));//新建个用于监听线程 th.Start;//打开新线程 } public void Stop { tcpl.Stop; th.Abort;//终止线程 } private void Listen { try { tcpl = TcpListener(5656);//在5656端口新建个TcpListener对象 tcpl.Start; Console.WriteLine("started listening.."); while(listenerRun)//开始监听 { Socket s = tcpl.AcceptSocket; remote = s.RemoteEndPo.; Byte stream = Byte[80]; i=s.Receive(stream);//接受连接请求字节流 msg = "<" + remote + ">" + .Text.Encoding.UTF8.GetString(stream); Console.WriteLine(msg);//在控制台显示串 } } catch(.Security.SecurityException) { Console.WriteLine("firewall says no no to application - application cries.."); } catch(Exception) { Console.WriteLine("stoped listening.."); } } } } 对Listen()补充介绍说明: 这个是Listener类核心部分该首先被构造只要布尔值listenerRun为true我们就可以在端口5656创建并开始个Tcp监听对象TcpListener进行监听网络中连接请求而旦listenerRun被置为false则表示结束了在循环体内部我们先接受个连接用s.RemoteEndPo获得它IP地址并获得其字节流根据获得字节流我们用UTF8编码将它转化为串最后我们就在控制台中显示获得串 对于catch语句第个块捕获个可能由防火墙引起例外对于防火墙而言它可能认为这是个特洛依木马或是儒虫病毒什么所以就会拒绝通过解决办法就是重新配置防火墙第 2个块用于捕获般例外比如当我们了stop()后我们销毁了TcpListener对象那就自然不可能再进行监听了 2.Sender类: Sender类就个所以是相当简单 代码以及注释如下: P2PTest { using ; using .IO; using .Net.Sockets; public Sender { public void Send( aInput) { stream = ""; //获得要发送信息 for( i=2; i<aInput.Length; i) { stream aInput[i] + " "; } try { TcpClient tcpc = TcpClient(aInput[1], 5656); //在5656端口新建个TcpClient对象 NetworkStream tcpStream = tcpc.GetStream; StreamWriter reqStreamW = StreamWriter(tcpStream); reqStreamW.Write(stream); reqStreamW.Flush;//发送信息 tcpStream.Close; tcpc.Close; } catch(Exception) { Console.WriteLine("connection refused by target computer"); } } } } 对Send()补充介绍说明: Send( aInput)将个作为参数第个元素Send(aInput[0])必须包含"send"这个字否则Sender对象不会被创建(更多内容在InputHandler类中);第 2个元素包含了目标计算机IP地址;剩下就是要发送内容信息了 在try块中我们根据远程计算机IP地址在端口5656(要确保端口号统)创建了个TcpClient对象然后我们建立个NetworkStream和个StremWriter对象来发送我们信息在catch块中我们用它来捕获般例外比如远程计算机拒绝连接请求、网络不通什么 3.InputHandler类: InputHandler类主要用来控制用户输入 代码以及注释如下: P2PTest { using ; public InputHandler { public bool appRun = true;//当appRun为false时结束 public InputHandler { Console.WriteLine("type help for a list of commands."); Input; } private Listener li;//个静态Listener对象 private inparam; private aInput;//aInput用于接受用户输入信息 public void Input { while(appRun) { inparam = Console.ReadLine; aInput = inparam.Split(' '); //将inparam分割目是为了获得串中第个字从而执行以下区别命令 switch(aInput[0]) { "send"://如果是"send"则新建个Sender对象并发送信息 Sender se = Sender; se.Send(aInput); ; "start"://如果是"start"则新开始监听 try { li.listenerRun = false; li.Stop; } catch(NullReferenceException) { ; } finally { li = Listener; } ; "stop"://如果是"stop"则停止监听 try { li.listenerRun = false; li.Stop; } catch(NullReferenceException) { ; } ; "exit"://退出 try { li.listenerRun = false; li.Stop; } catch(NullReferenceException) { ; } finally { appRun = false; } ; "help"://显示帮助信息 Console.WriteLine("Commands:"); Console.WriteLine("start: starts the listener"); Console.WriteLine("stop: stops the listener started"); Console.WriteLine("send: send <IP> <message> sends a message"); Console.WriteLine("exit: exits the application"); Console.WriteLine("help: you already know"); ; default: Console.WriteLine("Invalid command"); ; } } } } } 对InputHandler类补充介绍说明: 该类中有个静态Listener对象li旦计算机运行此并执行"start"操作该计算机就可以成为网络中服务器来监听其他计算机连接请求而该类核心部分是个switch 语句系列通过区别操作我们可以使计算机扮演区别角色:"send"操作表明该计算机相对目计算机而言成了客户端;而"start"操作就将计算机自身置为服务器端这正体现了P2P既是服务器端又是客户端"非中心化"原则;同时也提供了些其他辅助操作 4.Initialize类: Initialize类进行化工作它新建了个InputHandler对象只要该对象布尔值appRun为true就直运行的直到该值为false退出 代码以及注释如下: P2PTest { using ; public Init { public void Main { InputHandler ih = InputHandler;//新建个InputHandler对象 while(ih.appRun);//直到ih.appRun为false退出 Console.WriteLine("exiting.."); } } } 到此为止 4个类已经介绍完毕我想大家也早已等不及了吧下面就简单给大家介绍下具体实现思路方法 3.实现思路方法: 首先打开Visual Studio.Net新建个名为P2Ptest控制台应用Visual C#项目图示如下: ' border=0 > 图1 其次将以上 4个类分别保存为 4个文件:listener.cssender.csinputHandler.csinitialize.cs然后将这 4个文件添加到当前工程中同时把原有主文件删除即可(在initialize.cs中已经有主了) 最后按Ctrl+F5即可执行了 为了进行测试我们需要打开两个P2Ptest个作为服务器端另个作为客户端服务器端图示如下(此时已经开始监听了): ' border=0 > 图2 客户端图示如下(输入命令行:send 10.85.7.79 Hello,I'm Pitt.Can you hear me??): ' border=0 > 图3 再看服务器端情况图示如下: ' border=0 > 图4 从图示可以看到服务器端已经收到消息了同时只要客户端也开启了监听功能服务器端也就能向客户端发送信息了这样它们关系就不再是服务器-客户机关系了而是Peer-to-Peer关系了 4.整理总结: 现在个很基本P2P应用以及完成通过它我们可以利用P2P技术基本特性实现点对点通信通过这个我相信大家对C#下P2P编程应该有了大致了解对于这个不足点是功能比较简单只可以发送、接受信息而且还是基于控制台读者可以试着开发出功能更强大基于Windows FormsP2P应用 最后笔者希望能通过此文唤起大家对P2P技术兴趣P2P身后所蕴藏着无比创造力使人们对未来互联网充满了美好憧憬现在世界范围P2P应用热潮也是浪高过浪在可以预见未来随着对P2P研究进步深入和关注P2P群体逐渐增多P2P必将进入个飞速发展新时期 下载本文源代码:http://p2p.ppcn.net/csharpp2pSource.rar 0
相关文章
读者评论
发表评论 |