Design-Pattern: Client - Server
werde ich implementieren Sie eine client - server Anwendung in java. Client und server kommunizieren miteinander über TCP. Es gibt nur einen zentralen server, wer kümmert sich um alle Client-Nachrichten.
Ich nicht verwenden RMI für die Kommunikation, Sie kommunizieren mit tcp-sockets und client die Kommunikation mit einem anderen client über den server. Das bedeutet, dass der server leitet Nachrichten von client A zu client B.
Bin jetzt hier sitzen und versuchen, herauszufinden, wie zu entwerfen, die server-Anwendung.
Also den server listen für eingehende verbindungen die ganze Zeit. Das ist gut. Für jeden neuen client, der eine Verbindung zu dem server (dial-up), die server erstellen einen neuen Socket und ich würde Threads zu lassen, Sie arbeiten parallel.
Jeder Nutzer verwendet einen client, und jeder client muss authentifiziert mit Benutzername und Kennwort.
Bin auf der Suche nach einem design-pattern zu implementieren, die auf dem Server gespeichert/verarbeitet die Socket-Verbindung zu einem client.
Meine erste Idee war die Erstellung einer großen Singleton-Objekt aufgerufen, ClientManager, die enthält eine Karte. Also die Server nennen könnte, so etwas wie ClientManger.getSocketBy(username), um die Buchse des gewünschten Benutzer (Client).
Diese lösen könnte, die "Weiterleitung" von Nachrichten von Client A zu Client B.
Beispielsweise:
Benutzer A (Client A) möchte eine Nachricht senden, um Benutzer B (Client B). Also der server empfängt die Nachricht von Benutzer A (Client A) und rufen Sie Dank.getSocketBy(Benutzer B), um die socket-Kommunikation an die Benutzer B, und senden Sie dann die Nachricht über diese Buchse.
Aber das "design" auf der server-Seite scheint mir zu einfach, wie es sein könnte ein gutes design für so ein Ding, und im fehlt so etwas wie Events, Beobachter etc.
Andere Möglichkeit könnte sein, wirft man ein Ereignis auf den Thread, der behandelt die Benutzer-B-Buchse Anschluss instad der Aufruf der Steckdose.send () - Methode direkt.
Aber es muss einen besseren Weg geben ...
Ist es ein üblicher Weg, um etwas umzusetzen, wie dies ein design-Muster, die Sie empfehlen können? Im Wundern, wie ein instant-messanger-server wäre dies umzusetzen?
Übrigens: im nicht-Umsetzung einer instant-messanger und die Skalierbarkeit ist nicht das wichtigste, da es nicht die 1000 von clients gleichzeitig mit dem server kommunizieren. Ein sauberes software-design ist mehr wichtig für mich.
Im die Implementierung eines eigenen Protokolls (xml-basiert) für die Kommunikation. Gibt es eine Möglichkeit/design pattern, wie Sie wickeln Sie das Protokoll in ein Objekt oder ist es nichts, was ich tun könnte (aus dem Software-Architekten-Sicht) vorbehalten Zeichenfolge /xml-parsing?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie zwei Fragen, die ich denke.
Die erste ist in Bezug auf das, was "design pattern" für das routing. Sie haben angegeben, was Sie Taten, aber Sie ließ nicht darauf schließen, was problem, das Sie erleben (erleben oder zu antizipieren), andere als zu sagen, es war zu einfach. Muster sind gemeinsame Wege, gemeinsame Probleme zu lösen, sondern es ist ein Programm zu einfache ist nicht ein ich habe ein Muster gesehen für 🙂
Die zweite Frage ist über die Trennung die Umsetzung Ihres Protokolls von den Kunden, die es benutzen. Jetzt , dass ist eine gute Frage und etwas, das Sie sollten auf jeden Fall tun. Sie gehen zu wollen, um eine Nachricht zu erstellen-Objekt, das macht die Felder (wie Auf, Aus, Inhalte, etc). Ihr server muss die unformatierten xml-Daten in eine Art parser, der fungiert als eine Fabrik für die message-Objekten.
Können Sie die Unterstützung zusätzlicher Protokolle durch zuweisen einer anderen jeder TCP/IP-Port oder durch das starten mit einem Standard-Protokoll, dann client und server zu verhandeln, ein anderes Protokoll.
EDIT1:
Ich würde nicht die Karte eine Buchse für einen Benutzer, um ehrlich zu sein. Ich würde Abstrakt die Art und Weise Sie kommunizieren mit einem Benutzer in ein Objekt, vielleicht, Verbindung oder Kanal. Sie würde dann eine Unterklasse der Verbindung mit TcpConnection oder CorbaConnection oder was auch immer. Im Idealfall sind Sie etwas zu tun wie:
Beachten Sie, dass es keinen Hinweis für die Verbindung oder die Protokoll-Implementierung details.
haben Sie versucht, das Service Locator pattern. Aber Java bereits implementiert sind, was Sie tun, in seinem Kern, warum "das Rad neu zu erfinden". Sie können CORBA oder einer der TCP - /UDP-basierte Ansätze, wie EIS, wenn Sie nicht vorziehen, RMI, und die wird Ihnen wirklich helfen, bauen diese verteilte Anwendung von Ihnen.