1

Ich möchte eine Client-Anwendung implementieren und Komponententest (nicht unbedingt TDD), die mit einem TCP-Server unter Verwendung eines bestimmten Anwendungsprotokolls kommuniziert.Client/Server - Wie trennt man das Protokoll von der Netzwerklogik?

Ich habe in Orten wie here (1) und here (2) gesehen, dass Protokoll-Code vorzugsweise vom Netzwerk-Code entkoppelt sein sollte, so dass jeder einzeln getestet werden kann.

Ich verstehe jedoch nicht, wie ich diese Teile entwerfen und implementieren soll. Der erste Link spricht über eine MyProtocolHandler Klasse mit den Methoden HelloMessage() und HowdyMessage() Bedeutet das, dass ein Protokoll-Handler zwei Methoden zum Generieren einer Nachricht und zum Verarbeiten der Antwort erwartet? Wie werde ich sie benutzen? Noch eine Sache, es sollte verschiedene ProtocolHandler Klassen für jedes Nachrichten/Antwort-Paar oder nur eins für alle von ihnen geben?

Der zweite Link spricht über eine Reader und eine Writer. Auch hier kann ich nicht verstehen, wie ich sie verwenden soll.

Diese beiden sind nur Beispiele. Die Hauptfrage ist, wie kann ich die Logik vom Netzwerk entkoppeln und sie testen? Ich muss sagen, ich habe noch nichts versucht; Ich bin es gewohnt, nur gekoppelten Code zu schreiben und weiß nicht, wo ich anfangen soll.

Antwort

1

Dies sind verschiedene Möglichkeiten, um die Aufgabe zu nähern. Der Netzwerkstapel wird als verschiedene Schichten entworfen, wobei jede Schicht "gut definierte" Funktionalitäten für die obere Schicht bereitstellt und diese Funktionen durch APIs bereitstellt.

Wenn Sie also Ihr eigenes Protokoll auf Anwendungsebene implementieren möchten, das auf TCP oder auch auf SSL läuft (das wiederum wahrscheinlich auf TCP läuft), verwenden Sie die Socket-Schnittstelle. Die Art und Weise, wie Sie dieses Teil entwerfen, ist die gleiche, wie Sie jede Anwendung entwerfen würden. Im Allgemeinen möchten Sie Ihre Anwendungslogik vom Protokoll trennen, nennen Sie es A, Logik. Ihr Protokoll A ist verantwortlich für das Senden einer Nachricht an den Server mit Sockets (schreiben und lesen), lesen Sie die Nachricht vom Server, befassen sich mit Timeouts (zum Beispiel wenn Sie eine Antwort vom Server erwarten, nie kommt), mit Socket-Fehlern umzugehen , Nachrichtenformat, Nachrichtenanalyse, usw. Protokoll A wird alle diese Probleme aus Ihrer Anwendung ausblenden.

Ihre Bewerbung wird nur mit den API-Funktionen, die von Ihrem Protokoll umgehen: wie Hellomessage, wird es diese Methode aufrufen und nach innen, wird mit Hellomessage Steckdosen, Nachrichtenformat umgehen usw.

Jetzt kann Ihr Protokoll A sein implementiert von nur einer Klasse oder einer Gruppe von Klassen. Wenn es sich um eine Reihe von Klassen handelt, würde ich Ihnen empfehlen, sie zum selben Paket zu machen.

Um mehr darüber, wie es zu implementieren, würde ich zwei Optionen vorschlagen: 1) Sie haben eine Reader und Writer-Klasse, die Wrapper eines Sockets sind. Dann verwenden Ihre Protokollklassen diese Leser und Schreiber, und Sie können es testen, ohne ein Netzwerk mit einem Kind-Leser und -Writer zu haben, der keine Sockets verwendet. 2) Dies ist komplexer, Sie können eine Kommunikationsklasse haben, die Nachrichten zum Senden über eine Nachrichtenwarteschlange empfangen kann, und sie kann empfangene Nachrichten auch über eine andere Nachrichtenwarteschlange senden. Die Kommunikationsklasse kann mit Verbindungen oder Sockets umgehen (abhängig von der Abstraktionsebene). Es weiß, wie man Verbindungen öffnet, Timeouts behandelt, usw. Das ist ein besseres Design, aber viel zu komplex.

Ich hoffe, das hilft.

+0

Das ist genau, wie ich es implementiere, mit einer einzigen Klasse.Mein Verständnis der verknüpften Texte in der Frage ist jedoch, dass es möglich ist, den Code, der den Socket (den Netzwerkcode) verwendet, von dem Code zu trennen, der die API (den Protokollcode) implementiert, so dass ich letzteres testen kann, ohne dies tun zu müssen tatsächlich Networking durchführen. Wie das geht, kann ich nicht verstehen. – Piovezan

+0

@Piovezan, habe ich weitere Informationen hinzugefügt, aber Sie müssen daran arbeiten und mit einem Design kommen. Beginnen Sie mit etwas Einfachem und dann werden Sie anfangen, bessere Wege zu finden, dies zu tun. – rodolk

+0

Ich werde Option 1 ausprobieren. In Option 2 nach Nachrichtenwarteschlange meinen Sie ein vollwertiges wie RabbitMQ oder eine normale Java-Warteschlange? – Piovezan

Verwandte Themen