当前位置:编程学习 > asp >>

VC.net用Socket实现点对点的文件传输

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() ;
    从上面能够看出承受与发送恰恰是互为相反的过程,十分简单。
    至此,双方向的文件传输就完成了,只需求在每个对等的节点上同时完成上面的发送和承受的处置代码就能够做到相互传输文件了。
补充:Web开发 , ASP.Net ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,