2017-03-09 5 views
0

私は2つのPC間でメッセージを送信するためにTcp接続に取り組んでいますが、コンソールアプリケーションの場合はうまく動作しますが、Windowsフォームではリスナーは停止します。TCPリスナーがWindowsフォームでリッスンを停止する

例外:

Not listening. you must call the start() method before calling this method. 

はここに私のコードです。

コード:

 public static void TcpListener() 
    { 


      TcpListener server = null; 
     try 
     { 


       // Set the TcpListener on port 13000. 
       Int32 port = 8888; 
      IPAddress localAddr = IPAddress.Parse(Getlocalip()); 

      // TcpListener server = new TcpListener(port); 
      server = new TcpListener(localAddr, port); 

      // Start listening for client requests. 
      server.Start(); 

      // Buffer for reading data 
      Byte[] bytes = new Byte[256]; 
      String data = null; 

      // Enter the listening loop. 


      Thread t = new Thread(() => 
      { 
       while (true) 
       { 
        MessageBox.Show("Waiting for a connection... "); 

        // Perform a blocking call to accept requests. 
        // You could also user server.AcceptSocket() here. 
     TcpClient client = server.AcceptTcpClient(); 
        MessageBox.Show("Server Connected!"); 

        data = null; 

        // Get a stream object for reading and writing 
        NetworkStream stream = client.GetStream(); 

        int i; 

        // Loop to receive all the data sent by the client. 
        while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) 
        { 
         // Translate data bytes to a ASCII string. 
         data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); 
         // Console.WriteLine("Received: {0}", data); 
         if (data == "pbrush") 
         { 
          Runprocess("start " + data); 

          byte[] msg = System.Text.Encoding.ASCII.GetBytes(data + " opened successfully"); 

          // Send back a response. 
          stream.Write(msg, 0, msg.Length); 

         } 
         if (data == "calc") 
         { 
          Runprocess("start " + data); 

          byte[] msg = System.Text.Encoding.ASCII.GetBytes(data + " opened successfully"); 

          // Send back a response. 
          stream.Write(msg, 0, msg.Length); 
         } 

         if (data.ToString() == "getmac") 
         { 
          string result = Runprocess(data, true); 

          byte[] msg = System.Text.Encoding.ASCII.GetBytes(result); 

          // Send back a response. 
          stream.Write(msg, 0, msg.Length); 
         } 

         if (data.ToString() == "tree d:") 
         { 
          string result = Runprocess(data, true); 

          byte[] msg = System.Text.Encoding.ASCII.GetBytes(result); 

          // Send back a response. 
          stream.Write(msg, 0, msg.Length); 
         } 



         if (data.ToString() == "ipconfig") 
         { 
          string result = Runprocess(data, true); 

          byte[] msg = System.Text.Encoding.ASCII.GetBytes(result); 

          // Send back a response. 
          stream.Write(msg, 0, msg.Length); 
         } 
         if (data.ToString() == "facebook") 
         { 
          Runprocess("start " + data); 

          byte[] msg = System.Text.Encoding.ASCII.GetBytes(data + " opened successfully"); 

          // Send back a response. 
          stream.Write(msg, 0, msg.Length); 
         } 
         // Process the data sent by the client. 
         data = data.ToUpper(); 

         Console.WriteLine("Sent"); 
        } 

        // Shutdown and end connection 
        client.Close(); 
       } 

      }); 
      t.IsBackground = true; 
      t.Start(); 

     } 
     catch (SocketException e) 
     { 
      Console.WriteLine("SocketException: {0}", e); 
     } 
     finally 
     { 
      // Stop listening for new clients. 
      server.Stop(); 
     } 


     Console.WriteLine("\nHit enter to continue..."); 
     Console.Read(); 








    } 

答えて

0

あなたの問題は非常に簡単です - あなたは、finallyブロックでserver.Stop()を呼び出しています。 tryブロックではスレッドを開始しているだけなので、すぐにfinallyブロックにスキップします。

コンソールでキーを待っていますが、これはサーバーを停止した後です。

まず、スレッド内でtry-catchブロックを追加する必要があります。なぜなら、そこで発生する例外は現在捕捉されないからです。

第2に、server.Stop()の前にConsole.Read()を移動します。

+0

スレッド内にtry catchを追加した後、この例外が発生しました。ブロック操作がWSACancelblockingCallの呼び出しによってインターラプトされました。 – DumpsterDiver

+0

これはOKです。つまり、あなたが 'server.Stop()'を呼び出している間に 'server.AcceptTcpClient()'で待っていたことを意味します。 –

+0

**サーバを停止する前に**キーを待っていることを確認してください。 –

関連する問題