2017-04-02 4 views
-3

このコードのフォームは表示されません。どうすればそれを表示することができますか?コンソールを通して、すべてが機能します。Loadイベントでソケットに接続すると、フォームが表示されないのはなぜですか?

void Form1_Load(object sender, EventArgs e) 
     { 
      String host = Dns.GetHostName();//name kompa 
      //ip pc 
      IPAddress ip = Dns.GetHostByName(host).AddressList[0]; 
      const int port = 2222; 
      label1.Text = host; 
      label2.Text = "Сервер запущен на " + ip.ToString() + ":" + port.ToString(); 
      server.serversocket = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
      server.serversocket.Bind(new IPEndPoint(ip, port)); 
      server.serversocket.Listen(100); 

      //ошибочка в цикле 
      while (server.work) 
      { 
       MessageBox.Show("dsff"); 
       Socket handle = server.serversocket.Accept(); 
       richTextBox1.AppendText("новое подключение" + handle.RemoteEndPoint.ToString()); 
       new user(handle); 


      } 
+4

while()ループを使用してUIスレッドをハングアップすることは、最も基本的なGUIプログラミングミスの1つです。ワーカースレッドを使用します。 –

+1

また、OnLoadでループ/長時間実行する作業はお勧めできませんが、その段階ではまだフォームは表示されません。 OnShownはより優れています。しかし、@ HansPassantのアドバイスに従ってください。 –

答えて

1

Hans Passant氏によると、whileループでGUIスレッドをブロックしています。それだけではできません。イベントはできるだけ早く返す必要があり、決して無期限に実行することはできません。そして、サーバーがを停止するまで、このForm_Loadは戻ることができません。が機能します。

これは非常に一般的な間違いであり、基本的に私たちすべてが今世紀のマルチタスクとマルチスレッドに夢中になった理由です。もはやそれがなくてもワープロをすることはできません。

1

あなたはuiスレッドをブロックしています。同期ソケットサーバーに別のthreadを使用することは、解決策になります。もう1つの選択肢は、非同期ソケットを使用して、接続の待機中にアプリケーションの実行がブロックされないようにすることです。ソケットコードsamplesに基づいています。

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     InitSocketServer(); 
    } 

    internal void InitSocketServer() 
    { 
     IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); 
     var ipAddress = ipHostInfo.AddressList[0]; 
     IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000); 
     try 
     { 
      Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

      listener.Bind(localEndPoint); 
      listener.Listen(100); 
      listener.BeginAccept(AcceptCallback, listener); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

    private void AcceptCallback(IAsyncResult ar) 
    { 
     Socket listener = (Socket)ar.AsyncState; 
     Socket handler = listener.EndAccept(ar); 

     string data = null; 

     while (true) 
     { 
      var bytes = new byte[1024]; 
      int bytesRec = handler.Receive(bytes); 
      data += Encoding.ASCII.GetString(bytes, 0, bytesRec); 
      if (data.IndexOf("<EOF>") > -1) 
      { 
       break; 
      } 
     } 


     MessageBox.Show(handler.RemoteEndPoint + " : " + data); 

     byte[] msg = Encoding.ASCII.GetBytes(data); 

     handler.Send(msg); 
     handler.Shutdown(SocketShutdown.Both); 
     handler.Close(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("Test button click"); 
    } 
} 
関連する問題