WinFuture-Forum.de: Chat - Client Wartet Auf Daten - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Chat - Client Wartet Auf Daten


#1 Mitglied ist offline   skelle 

  • Gruppe: aktive Mitglieder
  • Beiträge: 793
  • Beigetreten: 15. Juli 04
  • Reputation: 0

geschrieben 02. November 2006 - 20:47

Ich bastel grad an einem kleinen Chat. Ich bin noch nicht so bewandert und C# und taste mich deshalb langsam voran.
Ich hänge atm an einem Punkt und zwar:
Der Client waret auf Daten vom Server und das sieht bei mir im Moment so aus
C#-Code:
while (true)
{
if (sn.DataAvailable==true)
{
byte[] buffa = new byte[6];
sn.Read(buffa, 0, 6);
Console.WriteLine(Encoding.ASCII.GetString(buffa))
;
}
}


Da hat die Client exe aber halt 100% CPU Last
Wie bekomm ich das jetz hin ohne dass er die schleife immerwieder sinnlos durchläuft?
Ich würde ma auf ein event tippen bekomme das aber nicht ganz auf die Reihe das zu verstehen =/
Oder muss ich es vllt doch anders machen?
wäre nett wenn mir jemand hilft
mfg skelle
0

Anzeige



#2 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 02. November 2006 - 21:10

Ich gehe mal davon aus, dass das über TCP laufen soll...

Ich würde die Schleife etwas anders gestalten.

1. Einen "Lauscher" erzeugen, der auf einem bestimmten Port lauscht...
 TcpListener lauscher = new TcpListener(IPAddress.Parse("127.0.0.1"), 1337);

2. und starten...
lauscher.Start();

3. die Schleife
while (true)
{
Console.WriteLine("Warte auf Verbindung");
TcpClient client = lauscher.AcceptTcpClient(); // Wartet so lange bis eine Anfrage kommt
Console.WriteLine("Verbindung akzeptiert.");
// Nun der Einfachheit halber einen StreamReader
StreamReader reader = Client.GetStream();
String zeile = "";
while ((zeile = reader.ReadLine()) != null)
{
Console.WriteLine(zeile);
}
}


klar? :unsure:
0

#3 Mitglied ist offline   skelle 

  • Gruppe: aktive Mitglieder
  • Beiträge: 793
  • Beigetreten: 15. Juli 04
  • Reputation: 0

geschrieben 02. November 2006 - 21:17

das mit dem TCPListener etc. hab ich schon alles untergebracht :unsure:
Ich hab ne Methode Recive die halt für das Empfangen der Daten und das Ausgeben in der Console zuständig is.
Mir gehts halt nur darum die Methode so zu gestalten dass er NUR dann ausm Network Stream liest wenn daten da sind also wenn sn.DataAvailable==true ist

Zitat

public void recive()
{
while (true)
{
if (sn.DataAvailable==true)
{
byte[] buffa = new byte[6];
sn.Read(buffa, 0, 6);
Console.WriteLine(Encoding.ASCII.GetString(buffa))
;
}
}


Wie gesagt das einfach ma nur die Methode zu empfangen

Brauch eben nur ne Lösung für die Schleife
mfg skelle
0

#4 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 02. November 2006 - 21:27

ok...wollte dir mit dem ReadLine nur eine alternative Methode zeigen.
Probier es mal so:

...
byte buffer = new byte[6];
int bytesToRead = 0;
do
{
bytesToRead =  sn.Read(buffer, 0, buffer.Length);
 Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytesToRead));
} while (sn.DataAvailable);
...

0

#5 Mitglied ist offline   MNG 

  • Gruppe: aktive Mitglieder
  • Beiträge: 293
  • Beigetreten: 29. März 06
  • Reputation: 0

geschrieben 02. November 2006 - 21:28

Bäh, Busy Waiting! :unsure:

Einfache Lösung: Deine "hängende" Methode in einen eigenen Thread werfen und in der while-Schleife den Thread periodisch schlafen legen mit Thread.sleep(dauer).
Komplizierte Lösung: .net-Remoting und das Observer-Pattern implementieren. Dazu auf dem Server einen Event definieren, bei dem sich alle Clients anmelden. Wenn der Server dann etwas sendet, wird bei den Clients der entsprechende Event-Handler aufgerufen.
0

#6 Mitglied ist offline   skelle 

  • Gruppe: aktive Mitglieder
  • Beiträge: 793
  • Beigetreten: 15. Juli 04
  • Reputation: 0

geschrieben 02. November 2006 - 21:41

Beitrag anzeigenZitat (Witi: 02.11.2006, 21:27)

ok...wollte dir mit dem ReadLine nur eine alternative Methode zeigen.
Probier es mal so:

...
byte buffer = new byte[6];
int bytesToRead = 0;
do
{
bytesToRead =  sn.Read(buffer, 0, buffer.Length);
 Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytesToRead));
} while (sn.DataAvailable);
...

Bringt ja au nich viel
da sobald die Methode einma aufgerufen wurde sn.DataAvailable false is und denn bricht er ab
aber trotzdem danke

@mng hatte die Methode eh schon in nem eigenem Thread und von daher einfach Thread.sleep(1000) eingefügt und problem is gelöst
danke jungs ! :unsure:
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0