Laden...

Problem mit Realisierung von einem Broadcast

Erstellt von YpsilonZet vor 15 Jahren Letzter Beitrag vor 15 Jahren 648 Views
Y
YpsilonZet Themenstarter:in
78 Beiträge seit 2007
vor 15 Jahren
Problem mit Realisierung von einem Broadcast

Hallo,
hänge zurzeit an einem für mich langsam verzweifelnden Problem fest.
Ich habe 2 Klassen:
-Serverklasse: Hier kommt jede Socketanfrage rein und wird dann per Threadarray in einen neuen Thread(Klasse) gepackt.
-Chatklasse: Hier wird überprüft ob es den User gibt und falls er was schreibt, per "Broadcast" an alle anderen Clienten gesendet.

Hier nun der Code der Serverklasse:

class Serverklasse
    {
        int anzahlthreads = 0;
        
        static void Main()
        {
            Serverklasse sk = new Serverklasse();
            Thread[] ta = new Thread[100];
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Bind(ep);
            Socket socket = null;

            while (true)
            {
                serverSocket.Listen(1);
                socket = serverSocket.Accept();
                sk.anzahlthreads = sk.anzahlthreads + 1;
                ta[sk.anzahlthreads] = new Thread(new Chatklasse(socket).run);
                ta[sk.anzahlthreads].Start(); 

            }
          }

        public int getanzahlthreads()
        {
            return anzahlthreads;
        }

Chatklasse:


Serverklasse sk = new Serverklasse();

        public Socket getSocket()
        {
            return Ssocket;
        }

        public void Broadcasten(string sendestring)
        {
            int anzahlthreads = sk.getanzahlthreads();
            Socket s;
            for (int k = 0; k < anzahlthreads; k++)
            {
                //meine Logik
                s = ta[k].getSocket();
                puffer = new byte[1024];
                puffer = Encoding.ASCII.GetBytes(sendestring);
                s.Send(puffer);
            }
        }

So, hoffe, mein Problem ist sichtbar geworden. Ich suche eine Möglichkeit, von jedem Thread, mir das jeweilige Socket zu holen, um dann die daten an jeden senden zu können

€dit: Klassen sind nur zum Teil reinkopiert. Unwichtige Methoden und Variablen wurden draussen gelassen.

Icq: 201599054

1.200 Beiträge seit 2007
vor 15 Jahren

Halte dir doch lieber die ChatKlassen oder die Sockets in einem Array anstatt den Threads?

Oder wieso baust du keine Komponente, die sowohl den Thread als auch die ChatKlasse beinhaltet?

Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!

YARRRRRR!

Y
YpsilonZet Themenstarter:in
78 Beiträge seit 2007
vor 15 Jahren

Danke für den Tip.
Bin mir nicht 100% sicher ob das so gemeint war, aber habs jetzt mal folgendermaßen geändert:


 class Serverklasse
    {
        int anzahlthreads = 0;
        Socket[] socketarray = new Socket[100];
        
        static void Main()
        {
            Serverklasse sk = new Serverklasse();
            IPEndPoint ep = new IPEndPoint(IPAddress.Any, port);
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Bind(ep);
            Socket socket = null;

            while (true)
            {
                serverSocket.Listen(1);
                socket = serverSocket.Accept();
                sk.anzahlthreads = sk.anzahlthreads + 1;
                //sobald ein neuer Client verbunden ist, kommt er in einen neuen Thread
                Thread testthread = new Thread(new Server2(socket).run);
                testthread.Start();
                sk.socketarray[sk.anzahlthreads] = socket;

            }
        }

        public Socket[] getSockets()
        {
            return socketarray;
        }

        public void Broadcasten(string sendestring)
        {
            int anzahlthreads = sk.getanzahlthreads();
            Socket s;
            for (int k = 0; k < anzahlthreads; k++)
            {
                s = sk.getSockets()[k];
                puffer = new byte[1024];
                puffer = Encoding.ASCII.GetBytes(sendestring);
                s.Send(puffer);
            }

Hatte deswegen ein Threadarray gemacht, weil ich nicht wusste, was passiert wenn ich mehrmals :


                Thread testthread = new Thread(new Server2(socket).run);
                testthread.Start();

aufrufe. War mir nicht sicher, ob dann immer ein neuer Thread gestartet wird und der alte weiterlaufen kann.

Icq: 201599054

1.200 Beiträge seit 2007
vor 15 Jahren

Das ist gar nicht toll, meines Erachtens. Baue eine ChatKomponente, kapsele darin deine Chatklasse und den Thread, instanziiere beim Connect eines Clients diese Komponente und starte sie, vergiss aber nicht sie vom Server in irgendeiner Liste abzulegen. Die Chatklasse sollte auch eine Referenz auf den Server enthalten.

Den Broadcast selber würde ich über ein Eventsystem steuern, also der Server wirft den Broadcast Event und die Chatklassen können diesen abbonieren.

Fraglich ist auch, ob so viele Threads gut sind. Ich würde lieber einen custom ThreadPool verwenden, wie du ihn bei codeproject findest.

Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!

YARRRRRR!