Netzwerk Programm
-
Hey,
weiß garnich so genau ob 'C++' der richtige Ort im forum hier ist aber dennoch zu meiner Frage.
Ich habe ein Netzwerkprogramm geschrieben was folgende Elemente enthält:
Lobby mit Chat
Session(2 Leute Nur) mit Chatalso Session würde ich mir als Privaten Room vorstellen. In der Lobby gibt es quasi einen Room-Browser wo man alle bestehenden "Rooms" sehen kann. Nun ist die Frage wieviele verschiedene Sockets soll ich benutzen? Soll ich für Room-Browser und Chat den selben benutzen? oder für Lobby,Lobby-Chat,Room-Chat und Room nen socket? Hoffe mal ihr wisst was ich meine?
2. Ich benutze einen Asynchronensocket aber wie stelle ich das an dass mein Server weiß das nun der Nickname gesetzt wird und nicht die info für einen neuen Room kommt oder für den chat? Hatte da an sowas gedacht wie es das IRC macht also quasi :
NICK: xxx
MSG: xxxund ggf. noch parameter dazunehmen. Aber wie werte ich das am besten aus? lass ich einfach einen string durchsuchen und baue eine mega verzweigung oder gibt es da bessere möglichkeiten.
Hoffe mal ihr versteht meine Fragen und könnt mir Tipps oder Hilfestellungen geben.
-
Mal abgesehen davon das dies kein Netzwerk-Forum ist.
Als Protokoll solltest du dir ein XML-Protokoll das alle wichtigen Informationen speichern kann ausdenken, als Socket würde ich dir zu einem Server-Chat-Socket raten, der alle Clients in einer Klasse Thread-sicher verwaltet damit hast du zwar mehr Verwaltungsaufwand auf der Server-Seite aber keine Beschränkungen was die gleichzeitigen offenen Verbindungen betrifft. Und eventuell einen zweiten Socket für alle Lobby und administrativen Aufgaben, die Clients pollen die Lobby in regelmäßigem Abstand, dann weiß man das sie noch da sind... aber das kann man natürlich auch anders machen.
-
Wie meinst du das mit einem socket und dann Klasse thread verwalten? Könntest du das in groben Zügen erläutern?
Hmm XML-Protokoll müsste ich mich dann mal mit beschäftigen wie sowas aussehen kann.
-
Also da ich nicht weiss welches OS und Framework du verwendest, hier mal informal die Funktionsweise:
Du entwickelst eine Klasse z.B. ChatServer, diese Klasse setzt einen server socket auf und wartet auf Verbindungen von client's. Wenn sich ein client beim Server anmeldet wird dieser in einen client pool eingetragen (vorausgesetzt er konnte sich erfolgreich auth.).
Ein bisschen pseudo-code
MyServerSocket server = new MyServerSocket("1.1.1.1"); while(true)// Clients akzeptieren (evtl. noch spez. auth. impl.) { MySocket client = server.accept(); MySocketInputStream in = new MySocketInputStream(client.getInputStream()); MySocketOutputStream out = new MySocketOutputStream(client.getOutputStream()); String name = in.read(); strTok = new MyTokenizer(name,":"); name = strTok.Next(); if (name.equals("connect")) { name = strTok.Next(); // für dich als Admin GUIAnzeige.append("\nNeuer client will verbinden: <"+ name + ">\n"); // dem client was sagen out.write("msg:Du bist mit dem Server XXX verbunden"); //Kommunikation mit neuem Client beginnen // der ChatHandler ist thread-safe , sonst würde es hier schon knallen. // In diesem Teil steckt dann die eigentliche Arbeit, "Rooms" und Chats" ChatHandler ch = new ChatHandler(name, client); ch.start(); // Danach kommunizieren die Clients nur noch über Ihre eigenen sockets // miteinander, verwaltet von ChatHandler }
Dieses einfache Anmeldeprotokoll besteht aus einem ":" separierten string, der etwa so aufgebaut ist "connect:HannsDerZerstörer:client version 0.1.1:Room #EingangsRoom". Das kann man natürlich auch noch besser in XML realisieren da dort (mit entsprechender Vorbereitung) alle Zeichen erlaubt sind, ich habs hier mal einfach gehalten um die Vorgehensweise aufzuzeigen.
-
okay okay,
danke erstmal. Muss jetzt mal gucken wie genau das zu realisieren ist aber denke mal die groben Züge habe ich verstanden.
Also ganz grob zusammengefasst würdest du alle clients über einen socket connecten lassen dann mit deren informationen vermutlich über accept ihnen einen eigenen Socket bereitstellen und dann alle clients bzw. sockets in einem Clientpool verwalten? Jedenfalls muss ich mich dann mal mit der verwaltung in threads beschäftigen. Gibt es da gute Artikel o.ä?
-
Schaust du hier.