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

2016-02-19 18:35 58 1 收藏

下面这个用Socket实现点对点的文件传输教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!

【 tulaoshi.com - 编程语言 】

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() ;  从上面可以看出接受与发送恰好是互为相反的过程,非常简单。
  
  至此,单方向的文件传输就完成了,只需要在每个对等的节点上同时实现上面的发送和接受的处理代码就可以做到互相传输文件了。

来源:https://www.tulaoshi.com/n/20160219/1618258.html

延伸阅读
功能说明: UUCP文件传输服务程序。 语 法: uucico [-cCDefqvwz][-i<类型][-I<文件][-p<连接端口号码][-][-rl][-s<主机][-S<主机][-u<用户][-x<类型][--help] 补充说明: uucico是用来处理uucp或uux送到队列的文件传输工具。uucico有两种工作模式:主动模式和附属模式。当在主动模式下时,uucico会调用远端...
功能说明: 显示目前所有以FTP登入的用户信息。 语 法: ftpwho 补充说明: 执行这项指令可得知目前用FTP登入系统的用户有那些人,以及他们正在进行的操作。
功能说明: 处理传送进来的文件。 语 法: uupick [-v][-I<配置文件][-s<主机][-x<层级][--help] 补充说明: 当其他主机通过UUCP将文件传送进来时,可利用uupick指令取出这些文件。 参 数:   -I<配置文件或--config<配置文件   指定配置文件。   -s<主机或--system&l...
功能说明: 中断FTP连线并结束程序。 语 法: bye 补充说明: 在ftp模式下,输入bye即可中断目前的连线作业,并结束ftp的执行。
功能说明: 设置文件系统相关功能。 语 法: ftp [-dignv][主机名称或IP地址] 补充说明: FTP是ARPANet的标准文件传输协议,该网络就是现今Internet的前身。 参 数:   -d   详细显示指令执行过程,便于排错或分析程序执行的情形。   -i   关闭互动模式,不询问任何...

经验教程

728

收藏

93
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部