开发一个使用C#简单的P2P应用
当客户机想在P2P网络上找到其他客户端共享的文件时,系统执行以下操作:
客户机用自己的用户名登录到索引。
客户机A希望注册他们想与其他用户共享的文件,以便其他用户能够找到文件。
客户机A发送应用程序查找与某个输入模式匹配的文件。
索引在其中搜索给定的文件名,并将下列结果返回给客户机a:
提供文件的客户端,如客户端B。
用户的IP地址。
它搜索的文件名。
一旦客户机A选择下载选项,客户机A使用搜索返回的IP地址来建立与客户B的连接。
一旦成功建立连接,就可以通知对方开始发送文件。
下载完成后,您应该将共享文件的副本注册到索引中。
这样的P2P网络可以用来共享任何类型的文件,这些文件可以在局域网或因特网上使用。
C #语言是开发P2P应用程序很容易因为其良好的网络功能的支持,尤其是两类支持TCPListener和TCPClient内部。以下是C #开发P2P应用的一个例子:
公共mytcplistener(端口):基地(港口)
{
}
公共无效StopMe()
{
如果(this.server!= null)
{
This.Server.Close();
}
}
}
转移公共类
{
MyTcpListener TCPL;
公共调动()
{
optionsloader OL =新OptionsLoader();
int端口= 8081;
如果(ol.port > 0)
{
端口;
}
其他的
{
端口= 8081;
}
this.tcpl =新mytcplistener(港);
}
公共无效transfershutdown()
{
Tcpl.StopMe();
}
公共无效listenforpeers()
{
尝试
{
编码ASCII = encoding.ascii;
()开始横向预置压应力;
虽然(真实)
{
在连接阻塞前,请接受
插座的tcpl.acceptsocket();
网络流数据流=新的网络流(S);
字符串的文件名;
字节{缓冲区=新的字节{ 256 };
数据流读取(缓冲,0, 256);
文件名= encoding.ascii.getstring(缓冲区);
StringBuilder sbfilename =新StringBuilder(文件名);
StringBuilder sbfilename2 = sbfilename。取代(
FileStream FS =新的FILESTREAM(sbfilename2.tostring(),我不知道。打开,读);
BinaryReader读者=新BinaryReader(FS);
字节{ }字节=新字节{ 1024 };
在读;
当((读=读,字节,0,字节长度))!= 0)
{
数据流。写(字节、0、阅读);
}
读者:关闭();
同花顺()数据流;
数据流结束();
}
}
赶上(线程前)
{
MessageBox显示(ex.tostring());
}
}
公共无效DownloadToClient(字符串服务器,远程文件名字符串,字符串保存本地的文件名)
{
尝试
{
TcpClient TCPC =新的TcpClient();
字节{读取=新字节{ 1024 };
optionsloader OL =新OptionsLoader();
int端口= 0;
如果(ol.port > 0)
{
端口;
}
其他的
{
默认端口号端口号,可以设置为使用
端口= 8081;
}
尝试连接/
IPHostEntry IPHost = DNS解决(服务器);
字符串{ } = ipHost别名别名;
IP地址= iphost.addresslist { };
IPEndPoint EP =新的IPEndPoint(addr { 0 },端口);
Tcpc。连接(EP);
获取流对象
流的= tcpc.getstream();
字节{ } b = encoding.ascii.getbytes(remotefilename.tochararray());
S.写的(B,0,b.length);
int的字节;
FileStream FS =新的FILESTREAM(保存本地的文件名,我不。openorcreate);
BinaryWriter W =新BinaryWriter(FS);
读取流对象,并转换为ASCII代码。
同时((字节= s读(读,0,读,长度))!= 0)
{
w写(读,0,字节);
读取=新字节{ 1024 };
}
TCPC密切();
W. Close();
关闭();
}
catch(异常前)
{
抛出异常(ex.tostring());
}
}
}
}