C# : Text an mehrere Clients schicken und empfangen

desaster0505

Erfahrenes Mitglied
Hi !

Habe auf der Suche nach meinem Problem diesen Thread gefunden:

http://www.tutorials.de/forum/net-a...ersende-ich-eine-datei-zu-einem-programm.html

Mich interessiert ob ich das als Basis für ein Programm nehmen kann, welches einen Text (und keine Datei wie im Thread oben) an mehrere Clients (es handelt sich um das gleiche Programm) über das Internet (IPs seien bekannt) senden und von diesen Clients auch empfangen kann?

Oder gibt es dafür noch andere, vllt. bessere Lösungen? Wenn ja, welche wären das? Bin für Beispiele und Links dankbar. Bin noch sehr neu in C#, weiss daher nicht was da am besten wäre und will nicht einen falsch Weg wählen.

Danke für Eure Hilfe.
 
Hi,

Wenn du mehrere Clienten gleichzeitig hast solltest du für jeden einen Thrad verwenden. Schau dir mal dieses Beispiel an. Dort wird eine ArrayList mit allen Clienten angelegt http://msdn.microsoft.com/de-de/library/bb979208.aspx.
Du musst die ServerThread-Klasse nur noch ein wenig erweitern und dann kannst du die ArrayList durchlaufen und an alle Daten verschicken.

Gruß
Erik
 
Hi!

ich habe mittlerweile den Link oben und noch paar andere anschaut zwecks Text versenden und mein Programm startet nun auch als Server mit einem Knopfdruck und kann sich auch mit sich selbst als Client verbinden auf Knopdruck und per IP-Angabe.
Das habe ich mir durch den Process-Explorer visualisieren und validieren lassen :)

Ich schaffe es nur nicht, jetzt irgendwie Text an das Programm selbst zu senden. Schließlich soll später noch jemand anderes das Programm bekommen. Einer muss dann der Server sein und die anderen kriegen seine IP und der Server schickt den text von jedem an jeden. Und wenn einer mal nicht da ist, dann spielt ein anderer User mit dem Programm halt den Server und so weiter.

Wenn ich jetzt mit NetworkStream clientStream = client.GetStream(); auf den Netzwerkstream zugreifen will steigt mein Programm im Debugmodus einfach aus.. heißt das Programm an sich läuft auch, aber ich kann mit dem Debugger nicht mehr Debuggen.. in Visual C# Express verschwindet die gelbe Zeile :-| . Ich weiss jetzt nicht ob das Programm so funktioniert,also Text sendet oder nicht.

Hoffe mir kann jemand sagen, was das Problem ist.. habe jetzt Stunden damit verbracht und komme nicht darauf..
Habe den interessanten Part als Code mal hier reingesetzt.. sieht viel aus, aber mich interessiert nur warum das Getstream nicht funktioniert bzw. was ich da falsch mache.

Also ich starte das Programm als Server:

C#:
 private void button1_Click(object sender, EventArgs e)
        {
           
                // Listener initialisieren und starten
            try
            {
              
                st = new ServerThread();
                Thread th = new Thread(new ThreadStart(st.thread_starten));
                th.Start();
             
                
            }
            catch (Exception ex) 
            { 
           MessageBox.Show(ex.Message);
            
            }
        
           }

Das ist der Thread..der gestartet wird. Interessant ist hier erstmal die While-Schleife.. das funktioniert auch soweit mit der Verbindung herstellen.

C#:
 class ServerThread
    {
       

        // Stop-Flag
        public bool stop = false;
        // Flag für "Thread läuft"
        public bool running = false;
        
        TcpListener listener = new TcpListener(IPAddress.Any, 4711);
                // Listener starten
                
        // Die Verbindung zum Client
        TcpClient tcpClient = null;
        Thread clientThread;
        String Hand;    
        bool loop = true;
   
        // Der eigentliche Thread
        public void thread_starten()
        {

            try
            {             
                // Listener starten
                listener.Start();
 
                while (loop)
                {
         
                   TcpClient tcpclient = listener.AcceptTcpClient(); 
                   running = true;      
                   Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                   clientThread.Start(tcpclient);
                }

                NetworkStream clientStream = tcpClient.GetStream();
                ASCIIEncoding encoder = new ASCIIEncoding();
                byte[] buffer = encoder.GetBytes("Hello Client!");
                clientStream.Write(buffer, 0, buffer.Length);
                clientStream.Flush();
              
                       
            }
            catch (Exception)
            {


            }

          



        }


        private void HandleClientComm(object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();

            byte[] message = new byte[4096];
            int bytesRead;

            while (true)
            {
                bytesRead = 0;

                try
                {
                    //blocks until a client sends a message
                    bytesRead = clientStream.Read(message, 0, 4096);
                }
                catch
                {
                    //a socket error has occured
                    break;
                }

                if (bytesRead == 0)
                {
                    //the client has disconnected from the server
                    break;
                }

                //message has successfully been received
                ASCIIEncoding encoder = new ASCIIEncoding();
                System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead));
            }

            tcpClient.Close();

          
        }
   }

Die Verbindung stelle ich mit der gleichen Instanz des gleichen Programms her über einen Button dessen Code lautet:

C#:
  try
            {
                Server_IP = txt_server_ip.Text;
                // Client initialisieren und mit dem Server verbinden
                //TcpClient server = new TcpClient(Server_IP, 4711);
                // Stream für lesen und schreiben holen
              

                IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(Server_IP), 4711);
                TcpClient client = new TcpClient(serverEndPoint);
                client.Connect(serverEndPoint);
 
                NetworkStream clientStream = client.GetStream();  //Hier steigt der Debugger einfach aus 

                ASCIIEncoding encoder = new ASCIIEncoding();
                byte[] buffer = encoder.GetBytes("Hello Server!");

                clientStream.Write(buffer, 0, buffer.Length);
                clientStream.Flush();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

            }


Hoffe da blickt jemand durch... danke schonmal für eure Hilfe.
 

Neue Beiträge

Zurück