RMI - Und Submodule
Übersicht

![]() |
Silver_KneeBetreff: RMI - Und Submodule |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi, hatte mir schon länger vorgenommen RMI in BlitzMax nachzuprogrammieren.
Remote Method Invocation bedeutet, dass man eine Methode eines Objektes aufruft, dass man selbst gar nicht im Prozess hat, also beispielsweise sich in einenem anderen Prozess oder auf einem anderen Rechner befindet. Damit kann man die ganze Netzwerkproblematik mit Protokoll schreiben, Lese- und Schreibemethoden abstimmen usw. sich sparen. Das übernimmt die RMI-Implementierung für einen. Da BlitzMax bringt dazu einiges mit, hat aber auch viele defizite. Daher ist eine ganze Modulsammlung entstanden. TBufferedStream Das ist mein früherer TCollectingStream mit einigen Verbesserungen und als Modul. Es ist ein vollwertiger Ersatz für BRL.SocketStream, der sich an der Implementierung von BlitzBasic orientiert. Proxy Mit dem Modul FSCOM.Proxy lassen sich Stellvertreter-Objekte erstellen. Das ist eigentlich eine Sache, die die Programmiersprache unterstützen muss, um wirklich komfortabel zu sein. Ich habe mich dabei an die Implementierung von Java orientiert: Alle Methodenaufrufe werden bei dieser Implementierung an eine Funktion weitergeleitet, in der man die Stellvertreteraufgabe übernehmen kann. Bei RMI wird dann zum Beispiel bei dem Methodenaufruf eine Netwerknachricht geschickt. Damit man nicht die Proxies umständlich selbst schreiben muss, liegt das Programm "buildproxies" bei. Das durchsucht (mit dem Lexer aus der BlitzMaxIde-Community-Edition) deinen Quelltext nach Klassen, die mit {proxy} gekennzeichnet sind und erstellt dafür eine Kind-Klasse, die ein Proxy implementiert. Das Modul FSCOM.Proxy selbst beinhaltet nur eine Funktion, die einem die Initialisierung eines solchen Objekts abnimmt. Serialisierung FSCOM.Serialization beinhaltet ein Interface zum serialisieren und deserialisieren von Objekten und eine Implementierung für einfache Objekte. Die Implementierung kommt mit zyklischen Referenzen klar und kann Objekt-Bäume richtig aufbauen. Komplexere Standard-Objekte wie Streams, Listen, Maps, Images, etc. werden in FSCOM.SerialisationEx folgen. Als Beispiel ist die Implementierung für TBank schon enthalten. Serialisierte Objekte kann man in Dateien abspeichern oder eben über das Netzwerk verschicken und anschließend wieder deserialisieren. RMI Die RMI-Implementierung nutzt diese Module um die Methodenaufrufe von gewissen Objekten auf dem Client an den Server zu übertragen. Im Wesentlichen brauch man dafür 3 Dateien: Client und Server müssen naturlich beide wissen wovon sie reden. Daher müssen die Klassen um die es beiden geht in einer Datei liegen, die beide Importen/Includen. Für die Proxy-Unterstützung muss diese Datei mit buildproxies gestartet werden: C:\...\>buildproxies C:\...\shared.bmx. Dann wird sich am Ende des Types ein Include zur Proxy-Klasse finden. Man kann bei größeren Projekten auch die Hauptdatei mit buildproxies starten. Das Programm geht dann rekursiv allen Import und Include-Befehlen nach. Es muss immer gestartet werden, wenn sich die Methodensignatur (Name, Rückgabewert und Parameter) ändert. BlitzMax: [AUSKLAPPEN] 'shared.bmx Der Server muss ein Service-Objekt erstellen, dessen Methoden von Clients aufgerufen werden und es bei RMI regestrieren. BlitzMax: [AUSKLAPPEN] 'server.bmx Der Client braucht ein Proxy-Objekt, dass mit dem Service verlinkt ist. RMIGetServiceObject übernimmt das fast komplett; man muss nur noch das Objekt casten. BlitzMax: [AUSKLAPPEN] 'client.bmx Das RMI-Modul ist nochmal in Submodule aufgeteilt, sodass man auf dem Server wirklich nur den Server-Code und auf dem Client den Client-Code importen kann, oder auch den Client ohne Proxy-Unterstützung. Dokumentation und Windows-Binaries liegen bei. Hier ist der Download. Ausblick
~EDIT: 01.06.2015~ Beispiel-Code an die aktuelle API angepasst. |
||
- Zuletzt bearbeitet von Silver_Knee am Mo, Jun 01, 2015 21:45, insgesamt 4-mal bearbeitet
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sehr coole Sache! Hast dir ordentlich was vorgenommen. Finds aber gut, dass die ganzen coolen Java-Konzepte langsam ihren Weg nach BM finden. | ||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
Silver_KneeBetreff: Update V0.2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
So. Ich hatte die letzten Tage, bevor der Arbeitsalltag wieder anfängt, mich noch mal hingesetzt und einige der geplanten Dinge umgesetzt:
Man kann jetzt Typen-Services anlegen: Für die wird pro Client ein Objekt angelegt. Eine Initialisierungsmethode wird mit einem Client-Objekt versorgt, das es ermöglicht auf dem Client Services aufzurufen. Dazu hat der Client eine eigene Service Registry bekommen und überwacht nun selbst seinen Stream. Der wesentliche Unterschied zwischen Client und Server ist jetzt nur noch, dass der Server das TCP-Server-Socket handling übernimmt und eben die Type-Services. Das macht ja auf dem Client keinen Sinn. Im Chat hat ohaz noch einige interessante Punkte angebracht, die ich mal mit auf die Liste nehme:
Download |
||
- Zuletzt bearbeitet von Silver_Knee am Mi, März 11, 2015 6:19, insgesamt 2-mal bearbeitet
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hatte bei meinem aktuellen Spieleprojekt die Gelegenheit, meine RMI-Implementierung in der Praxis zu testen.
Das hatte zu einigen Verbesserungen geführt. Die sind allerdings alle hinter den Kulissen passiert. Als einzige Änderung nach Außen hin, ist der Aufruf von RMIPollNetwork in der Hauptschleife. Der war leider zu fordernd für Timer. Neu hinzu gekommen sind fscom.async und fscom.asycex. RMI gib jetzt die Methodenaufrufe an einen Executor, der dann zum Beispiel die Aufrufe im Threadpool abarbeitet. Ein Modul dafür plane ich auch noch. Orientieren will ich mich wie bei RMI allgemein bei Java. Hier am ExecutorService. Wird aber sicher nicht so komplex. Schon allein, weil keine Interfaces zur Verfügung stehen. Download Mein Testcode für die, die es interessiert: Client (nutzt bah.maxunit) BlitzMax: [AUSKLAPPEN] SuperStrict Der Server BlitzMax: [AUSKLAPPEN] SuperStrict Die gemeinsamen Interfaces. Hier muss man buildproxies drüber laufen lassen. BlitzMax: [AUSKLAPPEN] SuperStrict Der größte Trick finde ich die Berechung der Fakultät von 5 bei der abwechselnd der Server und der Client die Methode des jeweils anderen aufrufen. Dabei bilden sie dann einen rekursiven Callstack über das Netzwerk. ~EDIT: 11.03.~ Fixed Download... |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group