2009-04-03 2 views
0

Я пишу клиент/сервер (как многие из вас, вероятно, уже знают!). Сервер будет отправлять данные клиенту. Тем не менее, клиент может подключиться один раз, и после этого он никогда не пытается подключиться снова, как только соединение будет прекращено. Аналогично, как только сервер отправил сообщение, он будет игнорировать будущие попытки подключения.Клиент/сервер оба отказались после 1 соединения

Сервер:

public Server(String p) 
    { 
     path = p; 
     listener = new TcpListener(IPAddress.Any, 1337); 
     listener.Start(); 
     Thread t = new Thread(new ThreadStart(ListenForClients)); 
     t.IsBackground = true; 
     t.Start(); 
    } 

    private void ListenForClients() 
    { 
     TcpClient client = listener.AcceptTcpClient(); 
     new Thread(new ParameterizedThreadStart(HandleClientCom)).Start(client); 
    } 

    private void HandleClientCom(object TcpClient) 
    { 
     new Dialog("Connection", "Connection established."); 
     TcpClient client = (TcpClient)TcpClient; 
     NetworkStream stream = client.GetStream(); 
     //SslStream stream = new SslStream(client.GetStream()); 
     //stream.AuthenticateAsServer(new X509Certificate(path + "\\ServerCert.cer")); 

     ASCIIEncoding encoder = new ASCIIEncoding(); 
     String str = "This is a long piece of text to send to the client."; 
     byte[] bytes = encoder.GetBytes(str); 

     stream.Write(bytes, 0, bytes.Length); 
     stream.Flush(); 
    } 

Клиент:

public TCP(BackgroundWorker b) 
    { 
     try 
     { 
      bw = b; 
      client = new TcpClient(); 
      IPEndPoint server = new IPEndPoint(IPAddress.Parse(srv), 1337); 
      client.Connect(server); //Connect to the server 
      bw.ReportProgress(0); //Update the GUI with the connection status 

      Thread t = new Thread(new ParameterizedThreadStart(HandleComms)); 
      t.IsBackground = true; 
      t.Start(client); 
     } 
     catch (Exception ex) 
     { 
      lastException = ex; 
     } 
    } 

    public void HandleComms(object c) 
    { 
     Boolean keepListening = true; 
     TcpClient client = (TcpClient)c; 
     NetworkStream stream = client.GetStream(); 
     //stream = new SslStream(client.GetStream()); 
     //stream.AuthenticateAsClient(srv); 

     byte[] msg = new byte[4096]; ; 
     int bytesRead = 0; 

     while (keepListening) 
     { 
      try 
      { 
       bytesRead = stream.Read(msg, 0, 4096); 
      } 
      catch (Exception ex) 
      { 
       lastException = ex; 
      } 

      if (bytesRead > 0) 
      { 
       StreamWriter writer = new StreamWriter("C:\\Users\\Chris\\Desktop\\ClientLog.txt"); 
       ASCIIEncoding encoder = new ASCIIEncoding(); 
       rx = encoder.GetString(msg); 
       writer.WriteLine(rx); 
       keepListening = false; 
       writer.Close(); 
      } 
     } 
    } 

Извините за огромное количество кода. Можно в любом случае указать, где я ошибся?

ответ

2

После того, как вы приняли соединение, вам нужно будет снова начать прослушивание.

Постарайся просто сделать это изменение:

private void ListenForClients() 
{ 
    while(true) 
    { 
     TcpClient client = listener.AcceptTcpClient(); 
     new Thread(new ParameterizedThreadStart(HandleClientCom)).Start(client); 
    } 
} 
+0

Абсолютно на месте! – Bailz

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