跳出C# tcp/ip 假死困境

來源:互聯網
上載者:User
原文出自:http://xidianwk.spaces.live.com/blog/cns!F2482102835C40AD!375.entryc#的TCP/IP編程我記得剛開始學VC的時候,就接到一些項目,裡面就用到了TCP/IP編程,當時因為是剛剛起步,因此在啃了N多的資料之後算是搞定了,但是如何?多線成,當時寫的並不是很成熟,因此,這次寫基於C#的TCP/IP通訊的時候,就必須考慮這個多線程的問題,下面是我的一個C/S通訊程式,裡面用到了多線程技術,比較完美的解決了問題,貼出代碼:服務段的:Int32 port=12345;
   
   
   //TcpListener server=new TcpListener(port);
   m_server=new TcpListener(port);
   try
   { 
    
    //m_server=server;
    TextBox1.Text="已經開始了";
    m_server.Start();    
     
     
     Thread m_thread=new Thread(new ThreadStart(GetConn));//開啟線成
     m_thread.Start();//運行
    
    
   }
   catch(SocketException ae)
   {
    MessageBox.Show("錯誤源"+ae.Source+"表示"+ae.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
   }
  }
  private void GetConn()//線成函數
 {
  m_client=m_server.AcceptTcpClient();
  TcpClient c=this.m_client;
  Thread m_thread=new Thread(new ThreadStart(GetConn));
  m_thread.Start();//線程中開闢另外一個新的線成,這樣掛起請求全部在新的線程等待,因此不用一個while(true)的迴圈,有效地解決了程式“假死”現象
  NetworkStream stream=c.GetStream();//下面就是一些讀和寫了,沒有什麼含量,不解釋了
  byte[] recv=new byte[256];   string msg="";
   string temp;
   try
   {
    int a=0;
    a=stream.Read(recv,0,256);
    if(a>0)
    {
     temp=System.Text.Encoding.ASCII.GetString(recv,0,a);
     msg+=temp;
     //recv.SetValue(0,0);
     //a=stream.Read(recv,0,256);
    }
    MessageBox.Show(msg);
    stream.Write(System.Text.Encoding.ASCII.GetBytes(msg),0,msg.Length);
    stream.Close();
    c.Close();
    
   }
   catch(SocketException es)
   {
              MessageBox.Show("錯誤源"+es.Source+"表示"+es.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
   }///////////////////////////////////////用戶端的代碼:private void button1_Click(object sender, System.EventArgs e)
  {
    string str=textBox1.Text;
  
   if(str.Length<=0)
   {
    MessageBox.Show("請輸入字元");
    return;
   }
    byte[] send=new byte[str.Length];
   send=System.Text.Encoding.ASCII.GetBytes(str);
   try
   {
    TcpClient m_client=new TcpClient("192.168.3.65",12345);
    NetworkStream stream=m_client.GetStream();
    stream.Write(send,0,send.Length);
    int len=stream.Read(send,0,send.Length);
    string aa=System.Text.Encoding.ASCII.GetString(send,0,len);
    stream.Close();
    m_client.Close();
    MessageBox.Show(aa);
   }
   catch(SocketException aa)
   {
    MessageBox.Show(aa.Message);
   }
  }//不進行解釋了,沒有什麼意思附加:早晨進行編碼的時候測試發現不能發送中文,應該是編碼那邊的問題,把Encoding.ASCII修改為Encoding.UT8就可以了。下面是圖片了: 
 
 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.