用Socket实现点对点的文档传输

2008-02-23 05:37:40来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  System.Sockes命名空间了实现 Berkeley 套接字接口。通过这个类,我们能够实现网络电脑之间的消息传输和发送。而在我下面要讨论的这个议题里,我们将讨论的是用套接字实现文档的传输.这种方法有别于FTP协议实现的的文档传输方法,利用ftp的方法需要一个专门的服务器和客户端,无疑于我们要实现的点对点的文档传输太为复杂了一些。在这里,我们实现一个轻量级的方法来实现点对点的文档传输,这样就达到了intenet上任何两个电脑的文档共享。

  在两台电脑传输文档之前,必需得先有一台电脑建立套接字连接并绑定一个固定得端口,并在这个端口侦听另外一台电脑的连接请求。

socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
socket.Blocking = true ;
IPEndPoint computernode1 = new IPEndPoint(serverIpadress, 8080);

socket.Bind(computernode1);

socket.Listen(-1);

  当有其他的电脑发出连接请求的时候,被请求的电脑将对每一个连接请求分配一个线程,用于处理文档传输和其他服务。

while ( true )

{

clientsock = socket.Accept();

if ( clientsock.Connected )

{

Thread tc = new Thread(new ThreadStart(listenclient));

tc.Start();

}

}

  下面的代码展示了listenclient方法是如何处理另外一台电脑发送过来的请求。首先并对发送过来的请求字符串作出判断,看看是何种请求,然后决定相应的处理方法。

void listenclient()
{
Socket sock = clientsock ;
try
{
while ( sock != null )
{
byte[] recs = new byte[32767];
int rcount = sock.Receive(recs,recs.Length,0) ;
string message = System.Text.Encoding.ASCII.GetString(recs) ;
//对message作出处理,解析处请求字符和参数存储在cmdList 中
execmd=cmdList[0];
sender = null ;
sender = new Byte[32767];

string parm1 = "";
//目录列举
if ( execmd == "LISTING" )
{
ListFiles(message);
continue ;
}
//文档传输
if ( execmd == "GETOK" )
{
cmd = "BEGINSEND " filepath " " filesize ;
sender = new Byte[1024];
sender = Encoding.ASCII.GetBytes(cmd);
sock.Send(sender, sender.Length , 0 );
//转到文档下载处理
DownloadingFile(sock);
continue ;
}
}
}
catch(Exception Se)
{
string s = Se.Message;
Console.WriteLine(s);
}
}

至此,基本的工作已完成了,下面我们看看如何处理文档传输的。
while(rdby < total && nfs.CanWrite)
{
//从要传输的文档读取指定长度的数据
len =fin.Read(buffed,0,buffed.Length) ;
//将读取的数据发送到对应的电脑
nfs.Write(buffed, 0,len);
//增加已发送的长度
rdby=rdby len ;
}

  从上面的代码能够看出是完成文档转换成FileStream 流,然后通过NetworkStream绑定对应的套节子,最后调用他的write方法发送到对应的电脑。

  我们再看看接受端是如何接受传输过来的流,并且转换成文档的:

NetworkStream nfs = new NetworkStream(sock) ;
try
{
//一直循环直到指定的文档长度
while(rby < size)
{
byte[] buffer = new byte[1024] ;
//读取发送过来的文档流
int i = nfs.Read(buffer,0,buffer.Length) ;
fout.Write(buffer,0,(int)i) ;
rby=rby i ;
}
fout.Close() ;

  从上面能够看出接受和发送恰好是互为相反的过程,很简单。

  至此,单方向的文档传输就完成了,只需要在每个对等的节点上同时实现上面的发送和接受的处理代码就能够做到互相传输文档了。




标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: Shell实现Unix进程间信息交换的几种方法

下一篇: STL泛型编程和设计新思维

热门词条
热门标签