2017-02-10 2 views
0

Моя цель состояла в том, чтобы создать синхронизированное рабочее пространство для двух клиентов (программа GUI, работающая на обоих из них и синхронизирующая с текстовыми сообщениями). У меня есть две кнопки в настоящее время, первая создает сокет с сервером, а вторая открывает новую форму (Form2, которая в настоящее время является пустой формой). Нажатие кнопки 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

Можете привести пример кода, который вы используете? Вы уверены, что сообщение проходит? Вы уверены, что сокет был открыт? Связан ли второй клиент? – pstrjds

+0

Образцы кодов. @pstrjds Оба клиента подключены, я вижу форму во втором клиенте, но он не отвечает так yeh, сообщение проходит. Я также вижу сообщение на сервере, так что соединение в порядке. –

ответ

0

причина, по которой ваша форма не отвечает, что вы пытаетесь запустить Form в фоновом потоке , Вам нужно будет открыть форму из потока пользовательского интерфейса (поток, содержащий насос сообщений). Это делается путем вызова Invoke (или BeginInvoke). Так как вы не указали основной код формы, я не могу сказать вам точную замену кода, но то, что вы хотите сделать, это передать ссылку на основную форму в ваш метод потока и в этом методе вы хотите вызвать Form.Show звоните по телефону:

+0

https://gyazo.com/e5ab4cd18e840987755cd3f56bd06160 После написания этой строки есть 3 синтаксических ошибки. Я изменил 'mainForm' на 'Form1', который является формой, которая показана в моем проекте. –

+0

@OfirAizenberg - Я сделал обновление. Я пропустил набор круглых скобок. Виноват. – pstrjds

Смежные вопросы