Netty - Wie bekomme ich die Server-Antwort im Client?

8

Ich bin meistens bei Netty, aber ein Konzept spielt immer noch auf mich an, und ich kann in den Tutorials und so weiter nichts finden. Erstens verstehe ich, dass Netty asynchron ist, aber es muss einen Weg geben, damit ein Client den Server aufruft und in der Lage ist, eine Antwort außerhalb des Handlers zu erhalten. Lassen Sie mich mehr erklären.

Ich habe einen Kunden wie unten dargestellt. Und bitte beachten Sie, dass ich verstehe, dass es bootstrapped ist und bei jedem Aufruf eine neue Verbindung aufgebaut wird, die nur dazu dient, das Beispiel kleiner und prägnanter zu machen. Bitte ignoriere diese Tatsache.

Client.java

%Vor%

Jetzt verstehe ich, wie man die Daten auf den Server bringt und feuere das Ergebnis ab. Die einzige Sache ist, wie gehe ich damit auf der Clientseite um? Ja, die clientHandler-Klasse kann Folgendes tun:

ClientHandler.java

%Vor%

Das Problem ist, wie kommt der Clientcode tatsächlich zu diesem Ergebnis? Alle Beispiele ähneln einem Chat-Dienst, bei dem das Ereignis etwas anderes auf dem Client auslöst, das nicht auf eine Antwort wartet. Selbst das http-Client-Beispiel, das ich gefunden habe, fehlt. Die Dokumentation insgesamt ist wirklich gut, aber es fehlt an Callbacks. Wie auch immer, in diesem Fall brauche ich den Client, um die Antwort vom Server zu bekommen, und basierend auf den Ergebnissen wird es tun, was es braucht.

Mit anderen Worten, wie schreibe ich den Client, um so etwas zu tun:

IdealClient.java

%Vor%

Weil der Hundeführer nicht weiß, wer nach der Antwort sucht oder wer die Frage gestellt hat. Und wenn es im Handler gemacht wird, als wie?

Zurück zu meinen Kommentaren zu den Beispielen, die http-Client- (und Handler-) Beispiele lassen das Ergebnis einfach in System.out ablegen. Wenn Sie eine GUI hätten, wie würden Sie das Ergebnis von Ihrer Anfrage an die GUI weitergeben? Ich habe nie irgendwelche Beispiele dafür gesehen.

    
Stephane Grenier 28.01.2012, 21:16
quelle

2 Antworten

5

Jestan hat Recht. In meinem Fall habe ich einen Kunden, der Preis Tick Daten verarbeiten muss. Ich benutze Antlr für das Parsing. Ich feuere meine Ereignisse in meinem Parser, aber in meinem Fall ist mein Protokoll String basiert. Unten ist ein Beispiel ohne Antlr, ich übergebe die String-Nachricht in deinem Fall könnten es die Benutzer sein.

%Vor%     
barnardh 29.01.2012, 06:54
quelle
1

Sie müssen es im Handler mit messageReceived () behandeln. Ich bin mir nicht sicher, was genau dein Problem ist. Ich schätze, Sie haben eine Antwort auf eine Anfrage, die sich je nachdem, welche Anfrage gemacht wurde, ändert? Vielleicht eine konkrete Beschreibung von etwas, was Sie tun, von einer Antwort, die wissen muss, von welcher Anfrage sie kam. Eine Sache, die Sie möglicherweise tun können, ist, ein langes lebendes Objekt an den Handler zu übergeben, der die ausstehende Anfrage kennt, und es kann die Antwort abgleichen, wenn sie es empfängt. Die Pipeline-Factory-Methode kann einen Verweis auf ein managerartiges Objekt an den Handler übergeben.

Das war ziemlich genau das, was ich sagen wollte. Ihr Handler wird in der PipelineFactory erstellt, die einfach Parameter von dort an den Handler übergeben kann:

%Vor%

Wenn Sie Ihre Pipeline erstellen, fügen Sie Ihrem Handler eine neue Verbindung hinzu. Übergeben Sie einfach ein oder mehrere Objekte, die eine Kommunikation mit der Benutzeroberfläche oder einem Controller ermöglichen.

    
chubbsondubs 28.01.2012 21:27
quelle