2016-05-31 13 views
2

I Nachricht über TCP/IP in C# Anwendung zu senden versuchen senden mit TCPClient und TCPListner Klassenkann nicht zweite Nachricht über TCP/IP

Es folgt mein Code, die ich von Codeproject Seite bekam.

Kundecode written over btn click

try 
     { 
      TcpClient tcpclnt = new TcpClient(); 
      Console.WriteLine("Connecting....."); 

      tcpclnt.Connect("192.168.0.102", 8001); 
      // use the ipaddress as in the server program 

      Console.WriteLine("Connected"); 
      //Console.Write("Enter the string to be transmitted : "); 

      String str = textBox1.Text; 
      Stream stm = tcpclnt.GetStream(); 

      ASCIIEncoding asen = new ASCIIEncoding(); 
      byte[] ba = asen.GetBytes(str); 
      Console.WriteLine("Transmitting....."); 

      stm.Write(ba, 0, ba.Length); 

      byte[] bb = new byte[100]; 
      int k = stm.Read(bb, 0, 100); 

      for (int i = 0; i < k; i++) 
       Console.Write(Convert.ToChar(bb[i])); 


      tcpclnt.Close(); 
     } 

     catch (Exception ex) 
     { 
      Console.WriteLine("Error..... " + ex.Message); 
     } 

Servercode written on form_load

try 
     { 
      IPAddress ipAd = IPAddress.Parse("192.168.0.102"); 
      // use local m/c IP address, and 
      // use the same in the client 

      /* Initializes the Listener */ 
      TcpListener myList = new TcpListener(ipAd, 8001); 

      /* Start Listeneting at the specified port */ 
      myList.Start(); 

      Console.WriteLine("The server is running at port 8001..."); 
      Console.WriteLine("The local End point is :" + 
           myList.LocalEndpoint); 
      Console.WriteLine("Waiting for a connection....."); 

      Socket s = myList.AcceptSocket(); 
      Console.WriteLine("Connection accepted from " + s.RemoteEndPoint); 

      byte[] b = new byte[100]; 
      int k = s.Receive(b); 
      Console.WriteLine("Recieved..."); 
      string str = string.Empty; 
      for (int i = 0; i < k; i++) 
      { 
       Console.Write(Convert.ToChar(b[i])); 
       str = str + Convert.ToChar(b[i]); 

      } 
      label1.Text = str; 
      ASCIIEncoding asen = new ASCIIEncoding(); 
      s.Send(asen.GetBytes("The string was recieved by the server.")); 
      Console.WriteLine("\nSent Acknowledgement"); 
      /* clean up */ 
      s.Close(); 
      // myList.Stop(); 

     } 

Hier am client, ich bin Zeichenfolge in Textbox über tcp geschrieben Senden und es erhielt auch von server.

Aber wenn ich versuche, eine andere Zeichenfolge zu senden, scheitert es ohne exception und Client-Anwendung hängt für unbegrenzte Zeit.

Was ist hier falsch?

+2

Das ist nicht Ihr Hauptproblem: TCP/IP ist streambasiert, nicht nachrichtenbasiert. Code wie dieser ist fatal fehlerhaft: Sie dürfen niemals annehmen, dass ein bestimmter Aufruf von "Receive" eine bestimmte Anzahl von Bytes empfängt. Alles was Sie sicher sein können ist, dass, wenn der Client 'N' Bytes schreibt, irgendeine Kombination von' Receive' Rufe schließlich alle 'N' Bytes empfangen wird. Code wie dieser kann in Test-Setups über lokale Sockets gut funktionieren und bei der Verwendung in einem tatsächlichen Netzwerk schlecht ausfallen. –

Antwort

1

Der Server sollte immer im Abhörmodus sein, d. H. Der Servercode sollte in der while-Schleife sein, damit er Clients fortlaufend annehmen kann. Ihr Server akzeptiert einen Client und schließt sich dann selbst. Wenn Sie also auf die Schaltfläche des Clients klicken, versucht ein neuer Client, eine Verbindung mit dem Server herzustellen, aber der Server ist nicht mehr verfügbar.

1

Mit Blick auf den Code, den Sie zur Verfügung gestellt, versucht der Server nur 1 Nachricht vom Client zu lesen, muss also in eine Schleife gelegt werden, um die mehreren eingehenden Nachrichten vom Client zu lesen, die Nachricht zu verarbeiten und Antwort zu senden und dann zu erhalten mehr Nachrichten.

Beachten Sie auch, dass der Server derzeit erwartet, dass nur ein Client jemals eine Verbindung herstellt, diesen Client verarbeitet und dann schließt.

Der Client ist im Wesentlichen das gleiche im Beispiel eingerichtet, so dass Sie nicht ändern können, wie man arbeitet, ohne auch den anderen zu ändern.