2017-02-10 4 views
0

私の目標は、2つのクライアント(両方で実行され、テキストメッセージと同期するGUIプログラム)の同期ワークスペースを作成することでした。 私は現在、2つのボタンを持っています。最初のボタンはサーバーとソケットを作成し、2つ目は新しいフォーム(現在空のフォームであるForm2)を開きます。 ボタン2をクリックすると、現在のクライアントのフォームが開き、他のクライアントがフォームを開くためのメッセージが送信されます。 何らかの理由で、ボタンをクリックして表示される最初のフォームは成功し、一方、最初のクライアントからのメッセージによって表示しようとしている他のクライアントは成功せず、「応答していません」。 2番目のクライアントのフォームが応答しないのはなぜですか? 両方のクライアントでForm2のインスタンスが前に定義されています。 両方のクライアントのコードは同じコードです。 コードサンプル: 1-ボタン1をクリックしてサーバーに接続しますサーバーからメッセージを受信して​​フォームを開こうとしています

private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      IPAddress ipAddress = new IPAddress(new byte[] { 127, 0, 0, 1 }); 
      IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000); 
      Socket Server_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      try 
      { 
       Server_Socket.Connect(remoteEP); 
       Thread SendingThread = new Thread(new ParameterizedThreadStart(CrazySendingThread)); 
       Thread RecievingThread = new Thread(new ParameterizedThreadStart(CrazyReceivingThread)); 

       SendingThread.Start(Server_Socket); /*A thread that always sends the messages in 'msgtosend' list.*/ 
       RecievingThread.Start(Server_Socket);/* A thread that always try to receive a message from the server(if there isn't it waits).*/ 
      } 
      catch (ArgumentNullException ane) 
      { 
       Console.WriteLine("ArgumentNullException : {0}", ane.ToString()); 
      } 
      catch (SocketException se) 
      { 
       Console.WriteLine("SocketException : {0}", se.ToString()); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("Unexpected exception : {0}", ex.ToString()); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.ToString()); 
     } 
    } 

2-ボタン2をクリックして、新しいフォームを開き:

private void button2_Click(object sender, EventArgs e) 
    {msgtosend.Add(Encoding.ASCII.GetBytes("/OpenNP")); 
      Np.Show();/* Np is defined as a global variable and built in Form1_load*/} 

3- CrazyReceivingThread - 常に試みるスレッド受け取るために:

public void CrazyReceivingThread(object srv) 
    { 
     string msg = ""; 

     Socket srvr = (Socket)srv; 
     byte[] data = new byte[1024]; 
     while (true) 
     { 
      System.Threading.Thread.Sleep(20); 
      int bytesRec = srvr.Receive(data); 
      msg = Encoding.ASCII.GetString(data, 0, bytesRec); 
      string[] msg_array = msg.Split(' '); 
      try { 
       switch (msg_array[0]) 
       { 
        case "/Mouse_pos": 
         {/*is not relevant for the question...*/}break; 

        case "/OpenNP": 
         { 
           try 
           { 
            Np.Show(); 
           } 
           catch /*The form is 'Not responding' but this exception is **not** being caught.*/ 
           { 
            Console.WriteLine("Form is not shown."); 
           }  
         } 
         break; 
       } 
      } catch(ArgumentNullException e) { 
       Console.WriteLine(e.Message); 
      } 
     } 
    } 
+1

使用しているコードの例を挙げることはできますか?あなたはメッセージが通過していると確信していますか?ソケットが開けられたことは確かですか? 2番目のクライアントは接続されていますか? – pstrjds

+0

コードサンプルが追加されました。 @pstrjds 両方のクライアントが接続されていますが、2番目のクライアントでフォームが表示されていますが、応答がないので、メッセージが通過しています。 サーバにもメッセージが表示されますので、接続は正常です。 –

答えて

0

をフォームに応答していない理由は、あなたがバックグラウンドスレッドでFormを起動しようとしているということです。 UIスレッド(メッセージポンプを含むスレッド)からフォームを開く必要があります。これはInvoke(またはBeginInvoke)を呼び出して行います。メインフォームコードをリストしていないので、正確なコードの置換はできませんが、メインフォームへの参照をスレッドメソッドに渡し、そのメソッドでForm.Show電話:

case "/OpenNP": 
{ 
    try 
    { 
     // where mainForm is a reference to the form 
     // that contains the buttons, the main form that is shown 
     mainForm.Invoke((Action)(() => Np.Show())); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Form is not shown. " + ex.ToString()); 
    }  
} 
break; 
+0

https://gyazo.com/e5ab4cd18e840987755cd3f56bd06160 この行を記述した後に3つの構文エラーがあります。 私は 'mainForm'を私のプロジェクトに表示されるフォームである 'Form1'に変更しました。 –

+0

@OfirAizenberg - 更新しました。私はかっこのセットを見逃しました。私の悪い。 – pstrjds

関連する問題