首页  ·  知识 ·  编程语言
用VisualC#实现P2P应用程序
起点,梦的开始  http://www.loverer.com/article.asp?id=119  .NET  编辑:dezai  图片来源:网络
程序共用到了四个类:一个Listener类(用来监听新的连接)、一个Sender类(用来发送信息)、一个Inputhandler类(用来控制输入)、一个Initialize类(用来完

程序共用到了四个类:一个Listener类(用来监听新的连接)、一个Sender类(用来发送信息)、一个Inputhandler类(用来控制输入)、一个Initialize类(用来完成初始化工作)。下面,我先给大家介绍一下这四个类,最后再给出程序的具体实现方法。

二.基本类介绍

1.Listener类:

Listener类是用来监听新的连接。当它的一个对象被建立并开启后,该对象就开始不断监听来自网络中的连接请求。一旦有了一个连接请求,该对象就设法建立连接并取得它的字节流进而转化成字符串显示在控制台中。当一个连接结束后,该对象就继续进行监听来自网络中的连接请求。

代码以及注释如下:

namespace P2PTest{ using System; using System.Net.Sockets; using System.Threading; public class Listener {private Thread th;private TcpListener tcpl;public bool listenerRun = true;//listenerRun为true,表示可以接受连接请求,false则为结束程序public Listener()//构造函数{ th = new Thread(new ThreadStart(Listen));//新建一个用于监听的线程 th.Start();//打开新线程}public void Stop(){ tcpl.Stop(); th.Abort();//终止线程}private void Listen(){ try {tcpl = new TcpListener(5656);//在5656端口新建一个TcpListener对象tcpl.Start();Console.WriteLine("started listening..");while(listenerRun)//开始监听{ Socket s = tcpl.AcceptSocket(); string remote = s.RemoteEndPoint.ToString(); Byte[] stream = new Byte[80]; int i=s.Receive(stream);//接受连接请求的字节流 string msg = "<" + remote + ">" + System.Text.Encoding.UTF8.GetString(stream); Console.WriteLine(msg);//在控制台显示字符串} } catch(System.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.RemoteEndPoint获得它的IP地址并获得其字节流。根据获得的字节流,我们用UTF8编码将它转化为字符串。最后,我们就在控制台中显示获得的字符串。

对于catch语句,第一个块捕获一个可能由防火墙引起的例外。因为对于防火墙而言,它可能认为这是一个特洛依木马或是儒虫病毒什么的,所以就会拒绝通过。解决办法就是重新配置防火墙。第二个块用于捕获一般的例外,比如当我们调用了stop()函数后,我们销毁了TcpListener对象,那就自然不可能再进行监听了。


2.Sender类:

Sender类就一个函数,所以是相当简单的。

代码以及注释如下:
对InputHandler类的补充说明:

该类中有一个静态的Listener对象li,一旦计算机运行此程序并执行"start"操作,该计算机就可以成为网络中的服务器来监听其他计算机的连接请求。而该类的核心部分是一个switch case语句系列,通过不同的操作,我们可以使计算机扮演不同的角色:"send"操作表明该计算机相对目的计算机而言成了客户端;而"start"操作就将计算机自身置为服务器端,这正体现了P2P的既是服务器端又是客户端的"非中心化"的原则;同时程序也提供了一些其他的辅助操作。
4.Initialize类:

Initialize类进行程序的初始化工作,它新建了一个InputHandler对象,只要该对象的布尔值appRun为true,就一直运行之,直到该值为false,程序退出。

代码以及注释如下: namespace P2PTest {  using System;  public class Init  { public static void Main() {  InputHandler ih = new InputHandler();//新建一个InputHandler对象  while(ih.appRun);//直到ih.appRun为false,程序退出 Console.WriteLine("exiting.."); }  } }
到此为止,四个类已经介绍完毕,我想大家也早已等不及了吧,下面就简单给大家介绍一下具体实现程序的方法。

 

三.实现方法

首先,打开Visual Studio.Net,新建一个名为P2Ptest的控制台应用程序的Visual C#项目,图示如下:



图1

其次,将以上四个类分别保存为四个文件:listener.cs,sender.cs,inputHandler.cs,initialize.cs。然后将这四个文件添加到当前的工程中,同时把原有的主文件删除即可(因为在initialize.cs中已经有主函数了)。

最后,按Ctrl+F5即可执行程序了。

为了进行测试,我们需要打开两个P2Ptest程序,一个作为服务器端,另一个作为客户端。服务器端的图示如下(此时已经开始监听了):

图2

客户端的图示如下(输入命令行:send 10.85.7.79 Hello,I'm Pitt.Can you hear me?):



图3

再看服务器端的情况,图示如下:



图4 从图示可以看到服务器端已经收到消息了。同时,只要客户端也开启了监听功能,服务器端也就能向客户端发送信息了。这样它们的关系就不再是服务器-客户机的关系了,而是Peer-to-Peer的关系了

本文作者:起点,梦的开始 来源:http://www.loverer.com/article.asp?id=119
CIO之家 www.ciozj.com 微信公众号:imciow
    >>频道首页  >>网站首页   纠错  >>投诉
版权声明:CIO之家尊重行业规范,每篇文章都注明有明确的作者和来源;CIO之家的原创文章,请转载时务必注明文章作者和来源;
延伸阅读