Laden...

Server ereignissbasierend

Erstellt von f.ritz vor 19 Jahren Letzter Beitrag vor 19 Jahren 2.530 Views
f.ritz Themenstarter:in
341 Beiträge seit 2004
vor 19 Jahren
Server ereignissbasierend

Hallo zusammen!

Ich möchte einen Server schreiben, der nicht in einer Scheife oder in Thread auf Clients wartet sondern Ereignisbasierend(sonst belaste ich den CPU unnötig).

Was kann ich da machen?


 ArrayList liste = new ArrayList();
 TcpListener listener = new TcpListener(1111);
   listener.Strart();
   while(true)     //Diese Schleife durch einen Ereigniss ersetzen
   {
     TcpClient client = listener.AcceptTcpListener();
     liste.Add(new MyClient(client));
    }

151 Beiträge seit 2003
vor 19 Jahren

Das würde mich auch Interessieren, ich kapiere das nie so ganz mit den delegates und Events...

502 Beiträge seit 2004
vor 19 Jahren

Also ich wage zu bezweifeln, dass das so möglich ist:
Wodurch sollte denn bitte das Event ausgelöst werden? Wohl doch durch einen Client, der sich mit dem Rechner verbinden möchte, oder? Aber der Client kann sich natürlich nur mit dem Server verbinden, wenn irgenwas am Server "lauscht"...

Aber ich versteh nicht warum deine Schleife den Server zu sehr auslasten sollte... Mach doch einfach mal ein Thread.Sleep in die Schleife, das sollte helfen.
Was auch noch was bringen könnte (kostet aber gleichzeitig auch Verwaltungszeit und -aufwand) wäre evtl. den Listener ebenfalls schon in einem separaten Thread laufen zu lassen.

Bart Simpson

Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...

f.ritz Themenstarter:in
341 Beiträge seit 2004
vor 19 Jahren

Hier ist der Code dass, ich geschrieben habe. Alles funktioniert auch, aber die Performance ist trotzdem nicht berauschend. Wenn ich z.B. einen anderen Fenster über meinen(für Server) verschiebe bleiben die Spuren drauf, weil die Grafikarte es nicht schafft UI mitzuzeichnen, weil die Schleife im Hintergrund läuft.

Frage: Kann ich noch was im Code verbessern?


//Server definieren.
ArrayList liste = new ArrayList();
TcpListener listener = new TcpListener(1111);
listener.Strart();

//Thread für den Lauscher
Thread thr = new Thread(new ThreadStart(listen));
thr.Start();

  //Laucht am Port.
void listen()
{
while(true)
{
TcpClient client = listener.AcceptTcpListener();
liste.Add(new MyClient(client));
}
}

C
980 Beiträge seit 2003
vor 19 Jahren

AcceptTcpClient ist eine blockierende Methode, die wartet bis eine Verbindung ankommt (der Thread schläft bis er vom Socket Thread eine entsprechende Message erhält). D.h. das Warten und somit auch die ganze Schleife belastet die CPU praktisch überhaupt nicht ... bist du sicher dass diese Schleife für die schlechte Performance verantwortlich ist?

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemnetsocketstcplistenerclassaccepttcpclienttopic.asp

E
63 Beiträge seit 2003
vor 19 Jahren

schau dir doch mal die asynchronen sockets an. ich
glaub das is genau das was du suchst...