2013-05-03 6 views
1

Итак, я пишу простое клиент-серверное приложение. Он должен отправить пакет, а затем ждать, чтобы получить пакет, а затем отправить один и т. Д. Проблема в том, что он получает первый пакет, но когда я запускаю TcpListener на второй итерации, он дает мне эту ошибку:TcpListener не подтверждает подключения

No connection could be made because the target machine actively refused it 127.0.0.1:13

private void listenForConnections() 
    { 
     bool prejelPaket = false; 
     listener = new TcpListener(IPAddress, port); 
     listener.Start(); 

     while (!packetReceived) 
     { 
      try 
      { 
       client = listener.AcceptTcpClient(); 
       listener.Stop(); 

       networkStream = client.GetStream(); 
       byte[] message = new byte[1024]; 
       networkStream.Read(message, 0, message.Length); 
       networkStream.Close(); 

       string strMessage = Encoding.UTF8.GetString(message); 
       packetReceived= true; 
       MessageBox.Show("received message: " + strMessage); 

       client.Close(); 
      } 
      catch (Exception ee) 
      { 
       thListen.Join(); 
      } 
     } 
    } 

    private void sendPacket(object pClient) 
    { 
     string message = "test message; 

     try 
     { 
      client = (TcpClient)pClient; 
      client.Connect(IPAddress, port); 
      networkStream = client.GetStream(); 
      byte[] strMessage = Encoding.UTF8.GetBytes(message); 
      networkStream.Write(strMessage, 0, strMessage.Length);   
      networkStream.Close(); 
      client.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 

ответ

1

Создайте клиент/сетевой поток один раз. Храните их в собственности до тех пор, пока вы не закончите отправку и получение. Затем закройте и утилизируйте. Не останавливайте/не закрывайте соединение между каждой итерацией.

+0

Спасибо, это мне очень помогло, теперь оно отлично работает. Приветствия. – Kajzer

1

Перемещение

listener.Stop(); 

вне цикла.

EDIT: объяснить, почему

Причина, почему это работает в первый раз, но второй итерации терпит неудачу, потому что после того, как первый клиент принимается от client = listener.AcceptTcpClient() следующая строка кода вызывает listener.Stop() который прекращает прослушивание подключений. Любые последующие вызовы listener.AcceptTcpClient() будут вызывать InvalidOperationException. Перемещение listener.Stop() вне цикла while останавливает прослушивание соединений только после выхода из цикла.

Глядя на него снова packetReceived установлен на истину и на первой итерации, так что он собирается выйти из цикла while после первого клиента, так или иначе, является ли это предполагаемым поведением?

+0

+1 Правильный ответ, но вы должны объяснить, почему – jgauffin

+0

Я думаю, что вы ошибаетесь, AcceptTcpClient() блокирует поток до тех пор, пока клиент не подключится, поэтому, когда он подключен, он просто останавливает прослушиватель. – Kajzer

+0

Неужели это не проблема? Если нет, я неправильно понял вашу проблему. – Hack

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