2017-08-30 8 views
0

に私はコンソールアプリで正常に動作しますが、私はアプリWindowsフォームでそれを使用しようとすると、それが起動しないSocket client = listener.AcceptSocket();tcplistenerとクライアントが同じフォームアプリ

でこのコードの動作が停止しているようだ、このコードを持っています実行されているコードが忙しいときでも、コンソール出力に続けます

public Form1() 
    { 
     InitializeComponent(); 

     Listen(); 
    } 
    public void Listen() 
    { 
     try 
     { 
      IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); 

      Console.WriteLine("Starting TCP listener..."); 

      TcpListener listener = new TcpListener(ipAddress, 1302); 

      listener.Start(); 

      while (true) 
      { 
       Console.WriteLine("Server is listening on " + listener.LocalEndpoint); 

       Console.WriteLine("Waiting for a connection..."); 

       Socket client = listener.AcceptSocket(); // <----- PROBLEM 

       Console.WriteLine("Connection accepted."); 

       Console.WriteLine("Reading data..."); 

       byte[] data = new byte[100]; 
       int size = client.Receive(data); 
       Console.WriteLine("Recieved data: "); 
       for (int i = 0; i < size; i++) 
        Console.Write(Convert.ToChar(data[i])); 

       Console.WriteLine(); 

       client.Close(); 
      } 

      listener.Stop(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Error: " + e.StackTrace); 
      Console.ReadLine(); 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (richTextBox1.Text != "") 
     { 
      textToSend = richTextBox1.Text; 
      run = true; 
     } 
     else 
     { 
      MessageBox.Show("Box Cant Be Empty"); 
      run = false; 
     } 
     if (run) 
     { 
      try 
      { 
       TCPclient = new TcpClient(SERVER_IP, PORT_NO); 
       nwStream = TCPclient.GetStream(); 
      } 
      catch 
      { 

      } 
      byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes(textToSend); 

      //---send the text--- 
      MessageBox.Show("Sending : " + textToSend); 
      nwStream.Write(bytesToSend, 0, bytesToSend.Length); 

     } 
    } 

答えて

0

:/ウィンドウが

ここにある私のコードを表示されません。あなたのアプリケーションの外に描かれています。

使用しているフォームには、フォームの更新とペイントに使用できるメインアプリケーションスレッドが必要です。非同期/待機パターンを調べて、IOコールをブロックするためにそれを使用する方法を学ぶ必要があります。トピックは大きすぎて簡単な簡単な答えは得られませんが、いくつかのgooglefuで見つかるはずのより良い記事があるかもしれませんが、ここには非同期に関する情報があります:https://msdn.microsoft.com/library/hh191443(vs.110).aspx

いくつかの追加情報は、UIの応答性についてはここで見つけることができます: https://msdn.microsoft.com/en-us/library/windows/desktop/dd744765(v=vs.85).aspx

0

Socket client = listener.AcceptSocket();は、着信パケットを待っています。 フォームコンストラクタでListen();を呼び出すと、WinForm UIが表示されない限り、が表示されず、メインスレッド(UI)がブロックされます。

Listen();を別のスレッドで実行してください。

+0

ok iveを実行しても機能しましたが、そのスレッド外の変数を変更するにはどうすればよいですか? fx。 MessageBox.Show();またはListBox1.Items.Add(); –

+0

親切に質問を編集し、何が必要なのかを説明してください –

+0

説明したスレッド以外の変数を変更する必要がある場合、その説明はかなり良いです –

関連する問題