C# Chatserver

05/24/2013 19:36 RedJ0hn#1
Hallo Leute,

ich habe folgende Frage, da ich für die Schule einen Chat Server in C# schreiben muss.

Und zwar geht es um folgendes ich habe einen TCP Server der auf einem Port lauscht, und bereits die erste Anfrage annimmt und bearbeitet. Er akzeptiert neue Clients und diese können sich schon einen Namen zu weisen.

Jetzt ist das Problem, dass jeder Client welcher auf dem Server verbunden ist eine Nachricht bekommen soll. Ich habe ein Klasse und darin die Methode für die Verbindung, welche folgendermaßen aussieht:

Aus einer meiner Klassen:



Ich denke ich muss, meine Clients einer Liste hinzufügen, und dann sagen jeder in der Liste soll die Nachricht empfangen.

Jedoch habe ich da anscheinend noch irgendwo ein Fehler, da mir gesagt wird, dass Verbindungen keinen Wert enthält und leider weiß ich nicht, wie man einen client dieser Liste hinzufügen soll :o
Die Liste:

Vielen Dank.

MfG
05/24/2013 20:08 #SoNiice#2
Wo ist das Problem deiner Liste etwas hinzuzufügen? Die Liste ist vom Typ "Verbindung".
Also wärs 'verbindungen.Add(verbindung);' - Oder wo hapert es bei dir?
05/24/2013 20:13 RedJ0hn#3
Ich glaube das Problem ist, dass ich die Klasse und Liste doof benannt habe, aber davon abgesehen kann ich Verbindung nicht einsetzen, weil das der Name der Klasse ist und nicht als Variable verwendet werden kann.
05/24/2013 20:22 #SoNiice#4
Mir ist gerade erst aufgefallen, dass da ja gar nicht die selbe Methode ist in den beiden Spoilern :facepalm:

Habe dir mal eine PN geschickt, schau es dir am besten einfach mal an ;-)
05/24/2013 20:57 RedJ0hn#5
^Erstmal Vielen Dank für die Mühe.

Jedoch würde ich es gerne ohne Hashtable machen, gibt es dann noch eine andere Alternative?

MfG
05/24/2013 20:59 #SoNiice#6
Warum möchtest du die Nachrichten überhaupt vom Clienten aus an alle senden?

Client -> Server -> All Clients
05/24/2013 21:10 RedJ0hn#7
Quote:
Originally Posted by SoNiice View Post
Warum möchtest du die Nachrichten überhaupt vom Clienten aus an alle senden?

Client -> Server -> All Clients
Naja,

ich wollte den Server so aufbauen, dass es einen Channel gibt, in dem alle schreiben und die Nachrichten die ohne jegliche Befehle geschrieben werden, kann jeder lesen, also ein Broadcast innerhalb des Servers an die Clients.

Dann wollte ich das es eine /flüster Funktion gibt für einzel Gespräche.

Also ein Client --sendet Nachricht --> Server --> X
--> Y
--> Z

Ich hoffe das Problem was ich habe ist soweit klar, also wenn ich die Methode aufrufe und etwas schreibe dann bekommt nur der Client die Nachricht der diese auch geschrieben hat. Darum brauche ich eine Möglichkeit jeden Clienten der auf den Server ist anzusprechen.

Desweiteren wäre es ja schön eine Benachrichtigung zu haben für jeden neuen User Zugang. Also XYZ hat den Server betreten / verlassen.

MfG
05/24/2013 21:31 #SoNiice#8
Du erstellst auf deinem Server eine Liste mit den Verbindungen, bei jeder eingehenden Verbindung fügst du eine neue in die Liste ein. Wenn der Server eine Nachricht vom Clienten empfängt überprüft dieser diese Nachricht auf einen bestimmten Parameter, wenn der nicht gesetzt ist, geht er die Liste durch und sendet an jeder User die Nachricht vom anderen User. Der Client empfängt diese und verarbeitet sie.

Ich verstehe nicht so ganz, was bei dir daran hapert.
05/25/2013 14:01 RedJ0hn#9
Quote:
Originally Posted by SoNiice View Post
Du erstellst auf deinem Server eine Liste mit den Verbindungen, bei jeder eingehenden Verbindung fügst du eine neue in die Liste ein. Wenn der Server eine Nachricht vom Clienten empfängt überprüft dieser diese Nachricht auf einen bestimmten Parameter, wenn der nicht gesetzt ist, geht er die Liste durch und sendet an jeder User die Nachricht vom anderen User. Der Client empfängt diese und verarbeitet sie.

Ich verstehe nicht so ganz, was bei dir daran hapert.
Soo, erstmal vielen Dank. Ich habe es jetzt soweit geschafft, das Einzige Problem, was ich jetzt habe ist, dass nur jede Zweite Nachricht ankommt <.<

MfG
05/25/2013 14:10 dready#10
Der Debugger ist dein Freund +g+
Entweder es ist ein Bug oder ein Logikfehler.
Ohne den Code können wir dir da schlecht weiterhelfen :)
05/25/2013 17:05 RedJ0hn#11
Quote:
Originally Posted by dready View Post
Der Debugger ist dein Freund +g+
Entweder es ist ein Bug oder ein Logikfehler.
Ohne den Code können wir dir da schlecht weiterhelfen :)

Dürfte vermutlich ein Logik Fehler sein.

Die Kommentare könnt ihr Ignorieren sind nur Infos für mich bzw. Sachen die noch zu machen sind.

Ich bin derzeit noch am überlegen, wie ich meiner TCP Liste eindeutig die Clientnamen zuweisen kann.

MfG
05/25/2013 19:01 #SoNiice#12
Entweder bin ich blind oder du hast uns nicht die Funktion für's senden der Nachrichten gegeben.
05/25/2013 19:44 RedJ0hn#13
Quote:
Originally Posted by SoNiice View Post
Entweder bin ich blind oder du hast uns nicht die Funktion für's senden der Nachrichten gegeben.
Code:
                foreach (TcpClient c in Liste)
                {
                    for (int i = 0; i < Liste.Count; i++) // TCP CLient einen eindeutigen Name zuweisen
                    {
                        info = new StreamWriter(Liste[i].GetStream());

                        info.WriteLine(clientname + " hat den Raum betreten");
                        info.Flush();
                        info = null;
                    }
                }
Habe das nur etwas umgeschrieben, bis jetzt kriegt man also selbst auch noch die Nachricht, wie gesagt, wenn ich den TCP Client einen Namen zugewiesen habe, kann ich dies ja beheben und eine Flüster Funktion noch extra einbauen.
Also bis jetzt kriegt jeder im Chat die Nachricht.