Laden...

Lauscht der TCPListener permanent nach Verbindungen?

Erstellt von Thomas B vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.500 Views
T
Thomas B Themenstarter:in
223 Beiträge seit 2006
vor 11 Jahren
Lauscht der TCPListener permanent nach Verbindungen?

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

C
2.121 Beiträge seit 2010
vor 11 Jahren

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.

W
872 Beiträge seit 2005
vor 11 Jahren

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.

T
Thomas B Themenstarter:in
223 Beiträge seit 2006
vor 11 Jahren

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

T
Thomas B Themenstarter:in
223 Beiträge seit 2006
vor 11 Jahren

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;
        }

D
216 Beiträge seit 2009
vor 11 Jahren

Les dir mal folgendes Tutorial hier im Forum durch: [Tutorial] Client-/Server-Komponente über TCP-Sockets.

Darth Maim

T
Thomas B Themenstarter:in
223 Beiträge seit 2006
vor 11 Jahren

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

W
872 Beiträge seit 2005
vor 11 Jahren

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.

3.170 Beiträge seit 2006
vor 11 Jahren

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