`
isiqi
  • 浏览: 16583982 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多
使用C#开发一个简单的P2P应用
作者:刘彦青 日期:2004-9-20
出处:P2P中国(PPcn.net)

作者: 刘彦青

本篇文章讨论了一种设计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应用

    通过以上分析可以看出,使用C#来开发P2P应用是一种相对简单且高效的方式。开发者可以利用.NET框架提供的强大工具集来构建稳定、高性能的应用程序。对于初学者而言,理解P2P网络的基础架构和通信流程至关重要,同时也...

    用Visual C#实现P2P应用程序

    在C#中实现P2P应用程序,我们可以利用.NET框架提供的网络编程类,如TcpListener和TcpClient。TcpListener用于监听来自网络的连接请求,而TcpClient则用于发起连接和发送/接收数据。这两个类是基于TCP协议的,提供了...

    C# p2p软件 功能强大C# p2p软件 功能强大

    而“C# p2p软件 功能强大”这个文件名暗示了这是一个关于C# P2P软件开发的项目或源代码,可能包含完整的程序或者关键模块的实现。 总的来说,C# P2P软件开发涉及网络编程、数据交换、文件管理、安全控制等多个方面...

    C# 开发P2P程序

    在这个“C#开发P2P程序”的项目中,`TFCXP2PTCP`可能是代码库或可执行文件的名字,它表明程序使用TCP作为主要的通信协议。TCP提供了一种可靠的、面向连接的数据传输方式,适合用于需要保证数据完整性的场景,如聊天...

    C#语言写的P2P的一个数据传输软件——飞鸽传书.net

    本文将深入探讨一个使用C#编程语言实现的P2P数据传输软件——飞鸽传书.net,同时也会涉及TCP、UDP协议以及Socket编程等关键知识点。 首先,我们来看飞鸽传书.net的基本原理。P2P网络架构下,每个节点既是客户端也是...

    一个优秀的P2P软件.采用C#开发.支持电驴协议.rar

    标题中的“一个优秀的P2P软件.采用C#开发.支持电驴协议.rar”表明这是一个基于C#编程语言开发的P2P(Peer-to-Peer)软件,且该软件兼容电驴(eDonkey)协议。P2P技术允许网络上的用户直接交换数据,而无需通过中央...

    C#实现P2P视频通信

    我们将深入探讨C#中的关键概念和技术,以及如何将它们应用于P2P视频通信。 首先,实现P2P视频通信需要理解网络编程的基本原理,尤其是TCP/IP协议栈和套接字(Sockets)编程。C#提供了System.Net命名空间,其中包含...

    使用C#开发的基于WCF和PNRP的P2P文件共享

    标题 "使用C#开发的基于WCF和PNRP的P2P文件共享" 指出,这是一个使用C#编程语言构建的项目,其核心功能是实现基于Windows Communication Foundation (WCF) 和 Peer Name Resolution Protocol (PNRP) 的点对点(P2P)...

    c#p2p(socket)

    1. "用Socket实现点对点的文件传输.doc" - 这很可能是一个文档,详细介绍了如何使用C#的Socket类来实现P2P网络中的文件传输。文档可能包含了步骤说明、代码示例以及可能遇到的问题和解决方案。 2. ...

    在C#下用三层框架开发的简单P2P程序(类似于QQ那种)

    在C#编程环境中,开发一个类似QQ的简单P2P(点对点)程序,采用的是三层架构,这种设计模式可以有效地分离业务逻辑、数据访问和用户界面,从而提高代码的可维护性和可扩展性。下面我们将深入探讨这个项目中的关键...

    C# p2p 源码 p2p 原理和说明

    本资源包含C#实现的P2P源码,这为我们提供了一个学习和理解P2P网络原理的良好平台。 首先,我们需要理解P2P的基本原理。在P2P网络中,每个参与者,即"对等方"(peer),既是服务的消费者也是服务的提供者。每个节点...

    p2p聊天程序(c#)

    【标题】"p2p聊天程序(c#)"揭示了我们要探讨的核心主题:使用C#编程语言构建一个点对点(P2P)聊天应用。P2P网络是一种网络架构,其中每个节点(或用户)都可以作为服务的提供者和消费者,与传统客户端-服务器模式...

    C# p2p视频点播系统

    结合提供的标题“C# p2p视频点播系统”和描述,我们可以推测这是一个使用C#语言实现的P2P视频点播程序,旨在提供一个便捷的学习和使用平台。 1. **P2P视频点播原理**: P2P视频点播系统的核心在于利用网络中其他...

    C#_-_P2P与NAT技术

    在 C# 中实现 P2P(对等网络)通信时,NAT 技术成为了一个关键的挑战,因为 NAT 会阻碍直接的节点间通信。P2P 网络中的节点通常位于不同的 NAT 背后,导致直接的 IP 和端口通信变得复杂。为了解决这个问题,开发者...

    C# P2P通信 QQ聊天 客户端通信

    - 在C#的P2P应用中,每个节点既可以作为服务器监听其他节点的连接请求,也可以作为客户端发起连接。 - 使用`Socket`的`Bind`方法绑定本地端点,`Listen`方法开始监听,`Accept`方法接收连接请求;而`Connect`方法...

    c#的p2p聊天程序代码

    在本文中,我们将深入探讨如何使用C#进行P2P(点对点)聊天程序的开发,这是一个典型的网络编程实践项目。C#是一种强大的、面向对象的编程语言,由微软公司开发,广泛应用于桌面应用、游戏开发以及网络编程等领域。 ...

    P2P点对点聊天(c#开发)

    通过上述知识点的学习和实践,可以构建出一个功能完备的P2P点对点聊天应用。在提供的“P2P聊天软件”文件中,应该包含了项目的源代码,可以通过阅读和分析这些代码来深入理解以上提到的各个技术点。如果有任何bug,...

    c# P2P的使用,TCP,点对点聊天,群发,文件发送

    在IT行业中,C#是一种广泛...综上所述,C#中的P2P应用开发涉及TCP连接的建立与管理、数据传输、文件操作以及网络通信的优化等多个方面。通过合理的架构设计和编程技巧,可以构建出高效、稳定的P2P聊天和文件共享系统。

    c#开发P2P聊天工具

    C#开发P2P聊天工具是一项涉及网络通信和多线程编程的任务。P2P(Peer-to-Peer)技术是一种分布式计算模式,允许参与者直接交互,而无需通过中央服务器。这使得P2P聊天工具在减少服务器压力和提高通信效率方面具有...

Global site tag (gtag.js) - Google Analytics