点对点通讯

点对点通讯通用类

 

using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;


///<summary> 
///C#对底层数据操作的通用类
///</summary> 
namespace Class1
{
 /// <summary>
 /// 数据连接设置
 /// </summary>
 public class SqlConnect
 { 
  static string sqlconnstr;


  /// <summary> 
  /// 连接字符串
  /// </summary> 
  public string ConnString 
  {  
   set   {    sqlconnstr=value;   }  
   get   {    return sqlconnstr;   } 
  }


  /// <summary> 
  /// 取得连接
  /// </summary>
  /// <returns></returns> 
  public SqlConnection GetSqlConnection() 
  {  
   SqlConnection _connection=null;  
   if(sqlconnstr==null || sqlconnstr=="")  
   {   
    string SystemDir=System.Environment.SystemDirectory;   
    DisposalConductService DisposalConductService1= new DisposalConductService(SystemDir+"//CBERP_Dis.DLL") ;   
    sqlconnstr = "server="+DisposalConductService1.GetValue("ServerName","(local)")    
     +";user id="+DisposalConductService1.GetValue("SqlAccount","sa")    
     +";password="+DisposalConductService1.GetValue("PassWord","jiayu520")    
     +";Database="+DisposalConductService1.GetValue("Database","CBERP"); 
   }  
   try  
   {   
    _connection = new SqlConnection(sqlconnstr);   
    _connection.Open();  
   }  
   catch(SqlException SE)  
   {   
    if(SE.Number==17 || SE.Number==18456)   
    {    
     if(MessageBox.Show("数据库访问参数设置不正确,是否对需要对其进行设置?","提示",MessageBoxButtons.YesNo,MessageBoxIcon.Question)==DialogResult.Yes)    
     {     
      sqlconnstr="";     
      DisposalConduct config = new DisposalConduct();     
      config.ShowDialog();     
      _connection=GetSqlConnection();    
     }    
     else    
     {     
      MessageBox.Show("建立数据库连接失败,程序不能继续运行!","错误",MessageBoxButtons.OK,MessageBoxIcon.Stop);     
      Application.ExitThread();     
      Application.Exit();    
     }   
    }   
    else   
    {    
     MessageBox.Show(SE.Message,"提示信息",MessageBoxButtons.OK,MessageBoxIcon.Information);   
     _connection.Close();   
    }  
   }  
   return _connection; 
  }


  /// <summary>
  /// 数据配置
  /// </summary>
  public class DataCatena : IDisposable
  { 
   private SqlConnection _connection; 
   /// <summary>  /// 数据配置  /// </summary> 
   public DataCatena()  
   {  
    SqlConnect sqlconnect = new SqlConnect();  
    _connection = sqlconnect.GetSqlConnection(); 
    _connection.Close(); 
   }


   /// <summary> 
   /// 数据配置 
   /// </summary>
   /// <param name="connStr">连接字符串</param> 
   public DataCatena(String connStr)  
   {  
    _connection = new SqlConnection(connStr); 
   }


   /// <summary> 
   /// 取得DataView 
   /// </summary> 
   /// <param name="Sqlstr">连接字符串</param> 
   /// <returns>数据视图</returns> 
   public DataView GetDataView(String Sqlstr) 
   {  
    DataView dv=null;  
    SqlDataAdapter myCommand = new SqlDataAdapter(Sqlstr, _connection);  
    DataSet ds = new DataSet();  
    try  
    {   
     myCommand.Fill(ds,"table");   
     dv=ds.Tables["table"].DefaultView; 
    }  
    catch(SqlException exc)  
    {   
     DebugBox db = new DebugBox(Sqlstr + "/r/n" + exc.Message);   
     db.Show();  
    }  
    return dv; 
   }


   /// <summary> 
   /// 清理资源
   /// </summary> 
   public void Dispose() 
   {  
    Dispose(true);  
    GC.SuppressFinalize(true);
   }


   /// <summary>
   /// 清理所有正在使用的资源。
   /// </summary>
   /// <param name="disposing"></param>
   protected virtual void Dispose(bool disposing) 
   { 
    if (! disposing)    return;
    if (this._connection != null)  
    {   
     this._connection.Dispose();  
    } 
   }


   /// <summary> 取得数据适配器</summary> 
   /// <param name="Sqlstr">SQL语句</param> 
   /// <returns>数据适配器</returns> 
   public SqlDataAdapter GetSqlDA(string Sqlstr) 
   {  
    SqlDataAdapter myCommand = new SqlDataAdapter(Sqlstr, _connection); 
    return myCommand; 
   }


   /// <summary>取得数据表</summary> 
   /// <param name="Sqlstr">SQL语句</param> 
   /// <returns>数据表</returns> 
   public DataTable GetDT(String Sqlstr) 
   {  
    SqlDataAdapter myCommand = new SqlDataAdapter(Sqlstr, _connection); 
    DataSet ds = new DataSet();  
    try  
    {   
     myCommand.Fill(ds,"table"); 
    }  
    catch(SqlException exc)  
    {   
     DebugBox db = new DebugBox(Sqlstr + "/r/n" + exc.ToString());  
     db.Show(); 
    }  
    return ds.Tables["table"];
   }


   /// <summary>执行语句</summary>
   /// <param name="Sqlstr">SQL语句</param>
   /// <returns></returns> 
   public object ExecWithValue(String Sqlstr) 
   {  
    object result=null;   
    _connection.Open();  
    SqlCommand myCommand = new SqlCommand(Sqlstr, _connection);  
    try  
    {   
     result=myCommand.ExecuteScalar(); 
    }  
    catch (SqlException exc)  
    {   
     DebugBox db = new DebugBox(Sqlstr + "/r/n" + exc.ToString());   
     db.Show();    //MessageBox.Show(exc.Message); 
    }   _connection.Close();  
    return result;
   }


   /// <summary>返回相应的行数</summary>
   /// <param name="Sqlstr">SQL语句</param>
   /// <returns>行数</returns> 
   public int Exec(String Sqlstr) 
   {  
    int sucess=0;        
    SqlCommand myCommand = new SqlCommand(Sqlstr, _connection); 
    _connection.Open();  
    try  
    {  
     myCommand.ExecuteNonQuery(); 
    }  
    catch (SqlException exc) 
    {   
     DebugBox db = new DebugBox(Sqlstr + "/r/n" + exc.ToString());   
     db.Show();    //    MessageBox.Show(exc.Message);   
     sucess=exc.Number;  
    } 
    _connection.Close();  
    return sucess; 
   }
  }


  /// <summary>单表操作</summary>
  public class SingleTable
  { 
   private DataCatena DataCatena; 
   private SqlDataAdapter myDataAdapter;  
   private DataSet ds; 
   /// <summary>单表操作</summary>
   /// <param name="Sqlstr"></param> 
   public SingleTable(string Sqlstr) 
   {  
    DataCatena = new DataCatena();  
    myDataAdapter = DataCatena.GetSqlDA(Sqlstr); 
    ds = new DataSet();  
    myDataAdapter.Fill(ds, "Table1"); 
   }


   /// <summary>更新一个表</summary>
   /// <param name="Sqlstr"></param> 
   public void SetUpdateCommand(string Sqlstr) 
   {  
    myDataAdapter.UpdateCommand = new SqlCommand(Sqlstr,myDataAdapter.SelectCommand.Connection); 
   }


   /// <summary>返回数据表</summary>
   /// <returns></returns> 
   public DataTable GetDataTable() 
   {  
    return ds.Tables["Table1"]; 
   }


   /// <summary>返回数据适配器</summary>
   /// <returns></returns>
   public SqlDataAdapter GetDataAdapter() 
   {  
    return myDataAdapter; 
   }


   /// <summary>更新表</summary> 
   public void Update() 
   { 
    myDataAdapter.Update(ds, "Table1"); 
   }
  }


  /// <summary>自动更新</summary>
  public class AutoUpdateObj
  { 
   private DataCatena DataCatena; 
   private SqlDataAdapter myDataAdapter;  
   private SqlCommandBuilder cb; 
   private DataSet ds;
 
   /// <summary>自动更新</summary>
   /// <param name="Sqlstr"></param> 
   public AutoUpdateObj(string Sqlstr) 
   {  
    DataCatena = new DataCatena();  
    myDataAdapter = DataCatena.GetSqlDA(Sqlstr);  
    cb = new SqlCommandBuilder(myDataAdapter);  
    ds = new DataSet(); 
    myDataAdapter.Fill(ds, "Table1"); 
   }


   /// <summary>更新SQL语句</summary>
   /// <param name="Sqlstr"></param> 
   public void SetUpdateCommand(string Sqlstr) 
   {  
    myDataAdapter.UpdateCommand = new SqlCommand(Sqlstr,myDataAdapter.SelectCommand.Connection);
   }


   /// <summary>设置Select语句 </summary>
   /// <param name="Sqlstr"></param> 
   public void SetSelectCommand(string Sqlstr) 
   { 
    myDataAdapter.SelectCommand = new SqlCommand(Sqlstr,myDataAdapter.SelectCommand.Connection);
    cb.DataAdapter = myDataAdapter ;  
    ds.Tables.Clear(); 
   }


   /// <summary>取得数据表</summary>
   /// <returns></returns> 
   public DataTable GetDataTable() 
   {  
    ds.Clear();   myDataAdapter.Fill(ds, "Table1");  
    return ds.Tables["Table1"]; 
   }


   /// <summary> 取得数据适配器</summary>
   /// <returns></returns> 
   public SqlDataAdapter GetDataAdapter() 
   {  
    return myDataAdapter; 
   }


   /// <summary>更新</summary> 
   public void Update() 
   {  
    try 
    {   
     myDataAdapter.Update(ds, "Table1"); 
    }  
    catch(SqlException sqlex)  
    {  
     MessageBox.Show("出错原因:"+sqlex.Message,"出错",MessageBoxButtons.OK,MessageBoxIcon.Error); 
    }
   }
  }
 }
}

 

点对点通讯基类

         /// 读取文件形式的可变信息


         /// </summary>


         /// <param name="s">要读取可变信息的Socket</param>


         /// <param name="strFile">读出后的文件保存位置</param>


         /// <returns>是否读取成功</returns>


         public static bool ReadDynamicFileFromSocket( Socket s,string strFile)


         {            


              int iLen =  ReadDynamicLenFromSocket(s) ;


              byte [] buf = new byte[iLen] ;


              FileStream fs = new FileStream(strFile,FileMode.Create,FileAccess.Write) ;


             


              try


              {


                   int iReceiveded = 0 ;


                   int iReceiveing = 0 ;


                   while(iReceiveded<iLen)


                   {


                       if (iReceiveded + DEALLEN <= iLen)


                            iReceiveing = DEALLEN ;


                       else


                            iReceiveing = iLen - iReceiveded ;                   


                        s.Receive(buf,iReceiveded,iReceiveing,SocketFlags.None) ;    


                        CommunClass.WriteTextToSocket(s,"OK") ;


                        iReceiveded+= iReceiveing ;


                   }


                   fs.Write(buf,0,iLen) ;


                   return true ;


              }


              catch(Exception err)


              {


                   MessageBox.Show("接收文件失败"+err.Message) ;


                   return false ;


              }


              finally


              {


                   fs.Close() ;


              }             


         }


     }//end class


}//end namespace


上面是俺的通讯基础类,有了这个类,再进行发送接受还不是小菜一碟吗?

 

点对点通讯发送和接收

上面介绍了通讯的基类,下面就是使用那个类进行发送和接收的部分:


二、发送部分:


发送咱们使用了多线程,可以同时进行多个任务,比如发送文件、发送文本等,互不影响:
发送文本方法:
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)) ;
}


下面是他调用用到的一些方法:


开始一个线?BR>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
以上就是所用的代码,希望大家批判指正.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值