使用C#进行点对点通讯和文件传输(发送接收部分) (From 阿赖的

80酷酷网    80kuku.com

  上面介绍了通讯的基类,下面就是使用那个类进行发送和接收的部分:二、发送部分:发送咱们使用了多线程,可以同时进行多个任务,比如发送文件、发送文本等,互不影响:发送文本方法:private void StartSendText(string strHost,int iPort,string strInfo)      {           SendText stText = new SendText(strHost,iPort,strInfo,new CommunClass.OnSend(OnSendDrawProgress)) ;           StartThread(new ThreadStart(stText.Send)) ;       }下面是他调用用到的一些方法:开始一个线程private void StartThread(ThreadStart target)       {           Thread doStep = new Thread(target) ;                      doStep.IsBackground = true ;           doStep.Start() ;       } 发送一部分(本文设置的是1024字节)成功后的回调方法        public void OnSendDrawProgress(int iTotal,int iSending)       {              if (iTotal != pbMain.Maximum)               pbMain.Maximum = iTotal ;                pbMain.Value = iSending ;       }因为使用的是线程,所以发送文本使用的是一个发送文本类的方法,该类如下:public class SendText     {          private string Host ;          private int Port ;          private string Info ;          private CommunClass.OnSend onsend ;         public SendText(string strHost,int iPort,string strInfo,              CommunClass.OnSend onSend)         {              Host = strHost ;              Port = iPort ;              Info = strInfo ;              onsend = onSend ;         }         public void Send()         {              Socket s  = null ;              try               {                   s = CommunClass.ConnectToServer(Host,Port) ;                    CommunClass.WriteCommandToSocket(s,"SENDTEXT") ;                   CommunClass.WriteCommandDescToSocket(s,"") ;                                      CommunClass.WriteDynamicTextToSocket(s,Info,onsend) ;              }               catch (Exception e)               {                   MessageBox.Show(e.Message) ;              }              finally              {                   if (s != null)                        s.Close() ;              }         }      }//end class      这样就可以使用一个线程发送文本了。发送文件的方法也类似:private void StartSendFile(string strHost,int iPort,string strFile)       {           SendFile sfFile = new SendFile(strHost,iPort,strFile,this.pbMain) ;           pbMain.Value = 0 ;           StartThread(new ThreadStart(sfFile.Send)) ;               }发送文件的类:public class SendFile     {          private string Host ;          private int Port ;          private string FileToSend ;          private ProgressBar pbar;          public SendFile(string strHost,int iPort,string strFile,ProgressBar pbMain)         {              Host = strHost ;              Port = iPort ;              FileToSend = strFile ;              pbar = pbMain ;         }         public void Send()         {              Socket s  = null ;              try               {                                      s = CommunClass.ConnectToServer(Host,Port) ;                    CommunClass.WriteCommandToSocket(s,"SENDFILE") ;                   CommunClass.WriteCommandDescToSocket(s,"") ;                                      CommunClass.WriteFileToSocket(s,FileToSend,new CommunClass.OnSend(OnSendDrawProgress)) ;              }               catch (Exception e)               {                   MessageBox.Show(e.Message) ;              }              finally              {                   if (s != null)                        s.Close() ;              }         }                   public void OnSendDrawProgress(int iTotal,int iSending)         {                  if (iTotal != pbar.Maximum)                   pbar.Maximum = iTotal ;                          pbar.Value = iSending ;         }                   }//end class当然,你发送一个命令让服务器端启动一个程序(靠,这不成木马了吗?)也可以:俺这里只给出一部分代码,其余的您自己可以发挥以下:public class ExeCuteFile     {          private string Host ;          private int Port ;          private string FileName ;          private string cmdParam ;                  public ExeCuteFile(string strHost,int iPort,string strFileName,string strCmdParam)         {              Host = strHost ;              Port = iPort ;              FileName = strFileName ;              cmdParam = strCmdParam ;         }                  public void Send()         {                   Socket s  = null ;              try               {                   s = CommunClass.ConnectToServer(Host,Port) ;                    CommunClass.WriteCommandToSocket(s,"EXECUTEFILE") ;                   CommunClass.WriteCommandDescToSocket(s,FileName) ;                   CommunClass.WriteDynamicTextToSocket(s,"",null) ;                   MessageBox.Show(CommunClass.ReadDynamicTextFromSocket(s)) ;              }               catch (Exception e)               {                   MessageBox.Show(e.Message) ;              }              finally              {                   if (s != null)                        s.Close() ;              }          }     }三、下面是服务器端接受信息的代码:创建监听:/// <summary>         /// 再给定的主机和端口上创建监听程序         /// </summary>         /// <param name="strAddress"></param>         /// <param name="iPort"></param>          private void BuildingServer(string strAddress,int iPort)         {              IPAddress ipAddress = Dns.Resolve(strAddress).AddressList[0];                            try              {                   listener =  new TcpListener(ipAddress, iPort);                  }              catch ( Exception e)              {                   AddInfo(e.Message) ;              }         }

开始监听:/// <summary>         /// 开始监听         /// </summary>          private void StartListen()         {              bool done = false;                       listener.Start();              while (!done)               {                   Socket s = listener.AcceptSocket() ;                   if(s != null)                   {                        DealWithSocket dws = new DealWithSocket(s,this.tbLog) ;                        StartThread(new ThreadStart(dws.DealWith)) ;                   }              }                  } private void StartThread(ThreadStart target)         {              Thread doStep = new Thread(target) ;              doStep.IsBackground = true ;              doStep.Start() ;         } 开始监听后,对于每一个监听到的客户端的连接都用一个单独的线程来处理,处理通过类DealWithSocket来完成,下面是类代码:public class DealWithSocket     {          private Socket s = null ;          private TextBox tbLog = null ;         public DealWithSocket(Socket newSocket,TextBox tbInfo)         {              s = newSocket ;              tbLog = tbInfo ;         }          public void DealWith()         {              string strCmd = CommunClass.ReadCommandFromSocket(s) ;              string strDesc = CommunClass.ReadCommandDescFromSocket(s) ;              AddInfo(strCmd) ;              switch(strCmd)              {                   case "SENDFILE" :                        CommunClass.ReadDynamicFileFromSocket(s,"e:\\rrr.txt") ;                                               break ;                   case "EXECUTEFILE" :                       string strParam = CommunClass.ReadDynamicTextFromSocket(s) ;                       string strResult = ExeCuteFile(strDesc,strParam) ;                        CommunClass.WriteDynamicTextToSocket(s,strResult,null) ;                       break ;                   default:                                      string strDetail = CommunClass.ReadDynamicTextFromSocket(s) ;                        AddInfo(strDetail) ;                       break ;              }              try               {                   s.Close() ;              }               catch (Exception e)               {                   AddInfo(e.Message) ;              }         }          private void AddInfo(string strInfo)         {              string Info = DateTime.Now.ToLongTimeString() + " "+ strInfo +"\r\n" ;              tbLog.Text += Info ;              tbLog.Refresh() ;         }          private string ExeCuteFile(string strFileName,string strCmdParam)         {              System.Diagnostics.Process proc = new System.Diagnostics.Process() ;              proc.StartInfo.FileName = strFileName ;              proc.StartInfo.Arguments = strCmdParam ;              try              {                   proc.Start() ;                   return "OK" ;              }              catch(Exception err)              {                   return err.Message ;              }         }     }//end class以上就是所用的代码,希望大家批判指正.

分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: