2009-04-03 5 views
0

Ich schreibe einen Client/Server (wie viele von Ihnen wahrscheinlich schon wissen!). Der Server wird Daten an den Client senden. Der Client kann jedoch einmal eine Verbindung herstellen und danach versucht er nie, die Verbindung erneut herzustellen, nachdem die Verbindung beendet wurde. Sobald der Server seine Nachricht gesendet hat, ignoriert er zukünftige Verbindungsversuche.Client/Server geben beide nach 1 Verbindung auf

Server:

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(); 
    } 

Auftraggeber:

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(); 
      } 
     } 
    } 

Sorry für riesige Mengen von Code. Kann man trotzdem darauf hinweisen, wo ich falsch gelaufen bin?

Antwort

2

Sobald Sie die Verbindung akzeptiert haben, müssen Sie erneut zuhören.

Versuchen Sie, gerade diese Änderung:

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

Absolut genau das Richtige! – Bailz

Verwandte Themen