Moin,
ich hoffe mal ich hab das richtige Forum getroffen.
Ich möchte einen mobilen Agenten basteln. Dafür wird zwischen zwei Rechnern eine Netzwerkverbindung aufgemacht und dann wird die .class des Agenten auf den Zielrechner übertragen. Danach wird das serialisierte Objekt des Agenten übertragen und auf dem Zielrechner wieder zusammen gebaut. (heißt einfach nur, dass das Objekt jetzt auf einem Rechner existiert auf dem vorher keine .class vorhanden war)
Das übertragen der .class funktioniert und auch das Laden dieser funktioniert. Jetzt scheitert es nur noch am Laden der serialisierten Daten - und langsam hab ich da so lange draufgestarrt, dass ich keine Ahnung mehr habe wodran es liegen könnte. Wäre super wenn jemand von euch mal kurz drüber schauen könnte.
Empfangen auf dem Zielrechner (serialisierter Kram ab Zeile 21):
Der Sendenteil vom anderen Rechner (auch ab Zeile 21):
die wichtigen Teile sind zwischen den ###
wie gesagt, das Laden der Klasse funktioniert (ich kann .newInstance machen und dann läuft das auch - nur fehlen dann die Werte in den Variablen). Problem ist dass er aus einem mir nicht ersichtlichen Grund die serialisierten Daten nicht empfängt ( in_ser.available() ist immer 0 - in.available() ist 257).
Ich würde mich riesig freuen wenn mir jemand von euch einen Tipp geben kann wo ich suchen muss, weil so langsam macht das keinen Spass mehr.
Vielen Dank,
Daniel
ich hoffe mal ich hab das richtige Forum getroffen.
Ich möchte einen mobilen Agenten basteln. Dafür wird zwischen zwei Rechnern eine Netzwerkverbindung aufgemacht und dann wird die .class des Agenten auf den Zielrechner übertragen. Danach wird das serialisierte Objekt des Agenten übertragen und auf dem Zielrechner wieder zusammen gebaut. (heißt einfach nur, dass das Objekt jetzt auf einem Rechner existiert auf dem vorher keine .class vorhanden war)
Das übertragen der .class funktioniert und auch das Laden dieser funktioniert. Jetzt scheitert es nur noch am Laden der serialisierten Daten - und langsam hab ich da so lange draufgestarrt, dass ich keine Ahnung mehr habe wodran es liegen könnte. Wäre super wenn jemand von euch mal kurz drüber schauen könnte.
Empfangen auf dem Zielrechner (serialisierter Kram ab Zeile 21):
Java:
ServerSocket socket = new ServerSocket(port);
Socket client = socket.accept();
DataInputStream in = new DataInputStream(client.getInputStream());
// dann kommen der Klassenname und die Größe der .class
String klassenname = in.readUTF();
int paketgroesse = in.readInt();
// die Daten der .class empfangen
byte[] classfile_bytes = new byte[paketgroesse];
in.readFully(classfile_bytes);
// empfangene Klasse laden
MyClassLoader cl = new MyClassLoader(classfile_bytes); // der eigene ClassLoader tut nicht mehr als das byte[] an defineClass weiterzureichen
Class<?> cls = cl.findClass("A01_Heimkontext.Agent");
cls = cl.loadClass("A01_Heimkontext.Agent"); // kann auch wieder raus, weil ändert nichts
// ###################################
// nun die serialisierten Daten empfangen und daraus ein Objekt machen
ObjectInputStream in_ser = new ObjectInputStream(client.getInputStream());
System.out.println( in_ser.available() ); // -> und hier kommt immer nur 0 raus
Object obj = in_ser.readObject(); // -> und hier bricht er dann ab
// ###################################
in.close();
in_ser.close();
client.close(); // brav wieder alles schließen
socket.close();
// Der Agent ist gelandet und kann jetzt seine Arbeit vollrichten
Method m = obj.getClass().getMethod("tuWasTolles");
m.invoke(obj);
Der Sendenteil vom anderen Rechner (auch ab Zeile 21):
Java:
String klassenname = this.getClass().getSimpleName();
Socket verbindung = new Socket(ip, port);
DataOutputStream out = new DataOutputStream( verbindung.getOutputStream() );
out.writeUTF( klassenname ); // schicke den Klassennamen (Agent)
out.flush();
// .class öffnen und den byte-puffer erstellen
FileInputStream classfile = new FileInputStream("bin/"+paketname+"/"+klassenname+".class");
classfile_bytes = new byte[ classfile.available() ]; // puffer erstellen
out.writeInt( classfile.available() ); // erstmal schicken wie viele Bytes übertragen werden sollen
classfile.read( classfile_bytes ); // Inhalt der .class in den Puffer
classfile.close();
out.write( classfile_bytes ); // Inhalt des Puffers rausschicken
// ###################################
// einen ObjectStream öffnen um die serialisierten Daten zu übertragen
ObjectOutputStream out_ser = new ObjectOutputStream(verbindung.getOutputStream());
out_ser.writeObject(this);
out_ser.flush();
out_ser.close();
// ###################################
die wichtigen Teile sind zwischen den ###
wie gesagt, das Laden der Klasse funktioniert (ich kann .newInstance machen und dann läuft das auch - nur fehlen dann die Werte in den Variablen). Problem ist dass er aus einem mir nicht ersichtlichen Grund die serialisierten Daten nicht empfängt ( in_ser.available() ist immer 0 - in.available() ist 257).
Ich würde mich riesig freuen wenn mir jemand von euch einen Tipp geben kann wo ich suchen muss, weil so langsam macht das keinen Spass mehr.
Vielen Dank,
Daniel