2016-04-18 15 views
-2
string strMessage = Encoding.UTF8.GetString(message); 
        MessageBox.Show("Message: " + strMessage); 
        int numToRemove = Int32.Parse(strMessage); 
        char head = strMessage[0]; 
        if(head.ToString() == "2") 
        { 
         MessageBox.Show("test"); 
        } 

このコードは正常に動作しますが、私はその後C#のソケット作業めちゃくちゃ遅い

button5.text = "X"; 

を追加する場合、それは、本当にゆっくり作業を開始し、それが表示されるまでボタンを「X」のために10秒のようになりますif文の後のものは動作しません。

これは全体のコードです:

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 
using System.Threading; 
using System.Windows.Forms; 

namespace TCPSockets { 
    public partial class Form1 : Form { 
     /************ 
     * Spremenljivke 
     * 
     * 
     * **********/ 
     // odjemalec/strežnik 
     TcpClient client = null; 
     TcpListener listener = null; 
     IPAddress ip = null; 
     int port = 1337; 

     // niti 
     Thread thClient = null; 
     Thread thListener = null; 

     // podatkovni tok 
     NetworkStream dataStream = null; 
     string sporocilo = ""; 
     int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9}; 


     public Form1() { 
      InitializeComponent(); 
     } 

     /************* 
     * Strežnik (listener) 
     * 
     * ***********/ 
     private void button1_Click(object sender, EventArgs e) { 
      // IP & port 
      ip = IPAddress.Parse(textBox1.Text); 
      port = Convert.ToInt32(textBox2.Text); 

      // nit => sicer vmesnik blokira, ko kličemo AcceptTcpClient() 
      thListener = new Thread(new ThreadStart(ListenForConnections)); 
      thListener.IsBackground = true; 
      thListener.Start(); 
     } 

     // ListenForConnections posluša na vratih in sprejema nove odjemalce 
     // Ko odjemalca sprejme, obdela njegovo sporočilo 
     private void ListenForConnections() { 
      listener = new TcpListener(ip, port); 
      listener.Start(); 

      // neskončna zanka, če želimo prejemati več sporočil 
      // neskončna zanka zato, ker ne moremo vedeti koliko sporočil bomo prejeli 
      while (true) { 
       try { 
        client = listener.AcceptTcpClient(); // ta funkcija blokira nit dokler se odjemalec ne poveže (ne pošlje sporočila) 

        // pridobivanje sporočila iz podatkovnega toka 
        dataStream = client.GetStream(); // dobimo podatkovni tok odjemalca in beremo podatke iz njega 

        byte[] message = new byte[1024]; 
        dataStream.Read(message, 0, message.Length); 
        dataStream.Close(); 

        string strMessage = Encoding.UTF8.GetString(message); 
        MessageBox.Show("Strežnik: Dobil sem sporočilo: " + strMessage); 
        int numToRemove = Int32.Parse(strMessage); 
        char head = strMessage[0]; 
        if(head.ToString() == "2") 
        { 
         button4.Text = "X"; 

        } 
        /* else if(head.ToString() == "2") 
         { 
          button5.Text = "X"; 
          sporocilo = ""; 
         } 
        */ 


       } 
       // obdelovanje izjem => ko ustavljamo strežnik prožimo izjemo 
       catch (Exception ex) { 
        thListener.Join(); // enostavno zaključimo nit z .Join() in ne .Abort()!!! 
       } 
      } 
     } 

     // ustavljanje strežnika 
     private void button3_Click(object sender, EventArgs e) { 
      if (client != null && client.Connected) client.Close(); // če imamo povezanega odjemalca, ta klic proži izjemo v while(true)... 
      listener.Stop(); // če nimamo povezanega odjemalca, ta klic proži izjemo v while(true)... 
     } 

     /********** 
     * Odjemalec (client) 
     * 
     * ********/ 

     private void button2_Click(object sender, EventArgs e) { 
      ip = IPAddress.Parse(textBox1.Text); 
      port = Convert.ToInt32(textBox2.Text); 

      // ustvarimo novo povezavo na strežnik v ločeni niti 
      // kot parameter si pošljemo TcpClient objekt, da celotno povezavo izvedemo v drugi niti 
      // na tak način bi lahko izvedli več simultanih povezav na isti strežnik (recimo za pošiljanje več datotek hkrati, ali pa tudi za izvedbo DDoS napada) 
      client = new TcpClient(); 
      thClient = new Thread(new ParameterizedThreadStart(SendPacket)); 
      thClient.IsBackground = true; 
      thClient.Start(client); 
     } 

     // nit za pošiljanje sporočila 

     private void button4_Click(object sender, EventArgs e) 
     { 

      sporocilo = "1"; 
     } 

     private void SendPacket(object pClient) 
     { 
      string message = sporocilo; 

      // spet try-catch blok, da polovimo napake (recimo strežnik offline) 
      try 
      { 
       client = (TcpClient)pClient; // samo type cast parametra 
       client.Connect(ip, port); // dejanska povezava s strežnikom 

       dataStream = client.GetStream(); // pridobivanje podatkovnega toka in pisanje vanj 
       byte[] strMessage = Encoding.UTF8.GetBytes(message); 
       dataStream.Write(strMessage, 0, strMessage.Length); 
       dataStream.Close(); // vedno, VEDNO!!! zapiramo podatkovne toke... 
       client.Close();  // ...kot tudi zapremo povezavo, ko smo končali 
      } 
      // če je bila napaka, jo lahko na uporabniku prijazen način obdelamo 
      catch (Exception ex) 
      { 
       MessageBox.Show("Odjemalec: Pošiljanje ni bilo uspešno!"); 
      } 

     } 

     private void button5_Click(object sender, EventArgs e) 
     { 
      sporocilo = "2"; 
     } 
    } 
} 
+0

button5.text = "X"; if文に入ります – Domi

+2

これはソケットとはどのような関係がありますか?あなたのソケットのコードはどこですか?質問をしながら、コードを正しく書式設定しようとする(インデントを修正する)。 –

+0

申し訳ありませんが、ソケットです。コード全体をコピーします。 – Domi

答えて

0

私はあなたのコーディングスタイル(特別にあなたは英語でコードを書く必要があること)についての作ることができるポイントの数十をさておき、あなたの主な問題は、あなたがしようとしているということです別のスレッドからGUIオブジェクトを更新する。面白いのは、例外が表示されていないことがわかりますが、GUIオブジェクトを更新するにはGUI(メイン)スレッドに移動する必要があります。
どうすればいいか確認するにはthis answerをご覧ください。

+0

それは学校のプロジェクトなので、私の言葉でやる必要があります。あなたの答えをありがとう、それは働いた。 – Domi

+0

@Domiあなたの問題を解決した場合は、回答を受け入れたものとして記入してください。 –

+0

ええ、私は本当にこれをたくさん使っていません。もう一度、ありがとう。 – Domi

関連する問題