Hiho Leute,
ich habe eine Verständnisfrage zum TCPListener. Wenn ich den Listener starte, lauscht der dann permanent nach Verbindungen? Kann ich dann in einer Form mit einem Timer von z.B. 50ms dauerhaft nach neuen Verbindungen suchen?
Gruß,
Thomas
lauscht der dann permanent nach Verbindungen?
Ja
Kann ich dann in einer Form mit einem Timer von z.B. 50ms dauerhaft nach neuen Verbindungen suchen?
Der Listener wartet selber auf eine Verbindung, du brauchst dem nicht ständig neu zu sagen dass er das tun soll.
Du musst ihm nur nach dem Herstellen einer Verbindung sagen dass er jetzt wieder lauschen soll. Aber ohne Timer.
Such dir mal Beispiele dazu, da sollte es etliche geben mit denen du ein bisschen spielen kannst.
Der Listener sollte in einem eigenen Thread laufen - da der Listener am besten blockiert, um Ressourcen zu sparen.
Ich wuerde dann fuer die Kommunikation zwischen GUI/Form (View) und Listener-Thread (Model) ein eigenes Object (Controller) implementieren, dass intern eine Thread-Safe Collection benutzt.
Danke für die Antworten,
ist dieses Tutorial geeignet? Simple Threaded TCP Server
Ich versuche einen Chat zu schreiben, der später für ein Netzwerkspiel genutzt wird.
Der Server soll erstmal Verbindungen herstellen und Textnachrichten der Clients an alle verschicken, die sich auf dem Server befinden.
Später kommt dann noch die Spielverwaltung hinzu, um ein Schummeln möglich einzudämmen soll die Logik auf dem Server laufen.
Gruß,
Thomas
Hey,
ich habe noch eine Frage. Mein Server und der Client funktionieren soweit. Jetzt möchte ich dafür sorgen, dass ich Verbindungen von mehreren Clients annehmen kann. Im Moment lasse ich den BinaryReader des Clients auf dem Server permanent in einer while Schleife in einem eigenen Thread laufen. Sollten sich nun 100 Clients verbinden, wäre das nicht zuviel für einen Server?
Wie handelt man am Besten viele Clients serverseitig? Anbei noch der Code für einen Client.
Gruß,
Thomas
this.mSocketing = new Thread(new ThreadStart(this.Socketing));
this.mSocketing.Start();
//////////////////////////////////////
private void Socketing()
{
while (true)
{
if (this.mStream.DataAvailable)
this.WriteToChat();
}
}
void WriteToChat()
{
if (this.mRtbChat.InvokeRequired)
{
this.mRtbChat.Invoke(new MethodInvoker(WriteToChat));
return;
}
this.mRtbChat.Text += this.mReader.ReadString() + Environment.NewLine;
}
Les dir mal folgendes Tutorial hier im Forum durch: [Tutorial] Client-/Server-Komponente über TCP-Sockets.
Darth Maim
Danke Darth,
Also doch für jeden Client auch einen Thread machen.
Was liefert eigentlich ein BinaryReader.ReadString() zurück, wenn der Server mit dem Verarbeiten nicht nach kommt und der Client zwei Nachrichten verschickt hat, bevor der Server die erste verarbeiten konnte?
Nachricht 1: hello
Nachricht 2: world
Liefert die Methode ReadString() dann Helloworld zurück oder wird das trotzdem einzeln abgearbeitet? Die Methode WriteToChat von mir würde entweder helloworld ausgeben oder in zwei zeilen schreiben.
// Ausgabe
// Möglichkeit 1
helloworld
// Möglichkeit 2
hello
world
Gruß,
Thomas
TCP sichert immer die Reihenfolge und buffert, aber nicht besonders viel - das ist die Aufgabe des Protokolls, nicht der Anwendung. Geht etwas verloren, wird ein Requeue gemacht - das passiert aber auch, wenn Du zu langsam bist.
Ob Du mit Schleifen oder Threads besser dran bist, haengt vor allem von der Anzahl und dem Verhalten der Clients ab - bei wenig Clients, wenig Traffic, sind threads effizienter, bei vielen Clients und viel Traffic eventuell Schleifen. Senden wuerde ich auf jeden Fall in einer Schleife, nicht in einem Thread pro Client.
Hallo,
Was liefert eigentlich ein BinaryReader.ReadString() zurück, wenn der Server mit dem Verarbeiten nicht nach kommt und der Client zwei Nachrichten verschickt hat, bevor der Server die erste verarbeiten konnte?
Der Reader liest das, was bereits im Stream steht. Einzelne Sendevorgänge der Gegenstelle werden da nicht auseinandergehalten.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca