选择显示字体大小

用visual c#实现p2p应用程序(1)

一.前言

p2p,即英文peer-to-peer的缩写,中译为对等互联或点对点技术。讲到p2p,人们就会想起napster,napster让人们认识到了p2p技术的威力,p2p技术也就通过napster进入了大多数用户的视野,napster的音乐文件交换功能是p2p的一个主要应用。 p2p技术可以让用户可以直接连接到其他用户的计算机,进行文件共享与交换。同时p2p在深度搜索、分布计算、协同工作等方面也大有用途。

简单地说,p2p就是一种用于不同pc用户之间,不经过中继设备直接交换数据或服务的技术,它允许inte.net用户直接使用对方的文件。每个人可以直接连接到其他用户的计算机,并进行文件的交换,而不需要连接到服务器上再进行浏览与下载。因为消除了中间环节,p2p技术使得网络上的沟通变得更容易、更直接。p2p改变了inte.net现在的以大网站为中心的状态、重返"非中心化",并把权力交还给用户。从某种意义上讲,p2p体现了inte.net的本质。在网络尚未发展成为现在的web之前,网民就是利用所谓的"布告板"等渠道彼此直接交换信息和文件。

目前inte.net的存储模式是"内容位于中心",而p2p技术的运用将使inte.net上的内容向边缘移动。这将带来以下改变:首先,客户不再需要将文件上传到服务器,而只需要使用p2p与其他计算机进行共享;其次,使用p2p技术的计算机不需要固定的ip地址和永久的inte.net连接,这使得占有极大比例的拨号上网用户也可以享受p2p带来的变革。

理解p2p技术方面的最好方法是仔细观察并理解一个实际的p2p应用程序。c#作为微软.net战略的重要棋子,对网络编程提供了很好的支持和优化。本文就通过一个程序,向大家介绍一下c#下的p2p编程的方法和实现机理。本文的这个程序虽然不是很有用,但却很直观地给出了p2p(点对点)编程以及套接口编程的一些基本知识和概念。它是建立在tcplistener以及tcpclient这两个类基础上的,除外还有相应的输入和输出控制。实现的原理也比较简单,但是用到了p2p技术重返"非中心化"的基本原则。简言之,用这个程序可以在网络中发送、接受信息,任何一台计算机既可以作为服务器端,又可以作为客户端。程序共用到了四个类:一个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对象,那就自然不可能再进行监听了。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons