Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media
Nel Formula 1 Technology and Media Centre di Biggin Hill, la velocità delle monoposto si trasforma in dati, immagini e decisioni in tempo reale grazie all’infrastruttura Lenovo che gestisce centinaia di terabyte ogni weekend di gara e collega 820 milioni di spettatori nel mondo
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
Il nuovo gimbal mobile DJI evolve il concetto di tracciamento automatico con tre modalità diverse, un modulo multifunzionale con illuminazione integrata e controlli gestuali avanzati. Nel gimbal è anche presente un'asta telescopica da 215 mm con treppiede integrato, per un prodotto completo per content creator di ogni livello
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce
Abbiamo provato il nuovo HUAWEI Pura 80 Pro. Parliamo di uno smartphone che è un vero capolavoro di fotografia mobile, grazie ad un comparto completo in tutto e per tutto, In questa colorazione ci è piaciuto molto, ma i limiti hardware e software, seppur in netto miglioramento, ci sono ancora. Ma HUAWEI ha fatto davvero passi da gigante per questa nuova serie Pura 80. Buona anche l'autonomia e soprattutto la ricarica rapida sia cablata che wireless, velocissima.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-02-2008, 19:55   #1
morskott
Member
 
Iscritto dal: Jul 2005
Messaggi: 291
[JAVA] Passarsi un Class tramite Object(Out/In)putStream

Salve, avrei bisogno di passare un oggetto di tipo Class tra un server e un client. ho provato prima di tutto a fare un esempio banale
Codice:
import java.net.*;
import java.io.*;

public class TestClassLoader{
	
	public static void main(String[] args) throws Exception{
		final String className=args[0];
		ServerSocket ss=new ServerSocket(333);
		Thread t1=new Thread(new Runnable(){
			public void run(){
				try{
				Class<?> cc=Class.forName(className);
				System.out.println("CLIENT:"+cc.toString());
				Socket s=new Socket("localhost",333);
				ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());
				System.out.println("CLIENT:ObjectOutputStream aperto");
				oos.writeObject(cc);
				oos.flush();
				System.out.println("CLIENT:Oggetto mandato");
				oos.close();
				s.close();
				}catch(Exception ex) {System.out.println("NONONO "+ex.toString());}
			}
		});
		t1.start();
		Socket s=ss.accept();
		ObjectInputStream ois=new ObjectInputStream(s.getInputStream());
		System.out.println("SERVER:ObjectInputStream aperto");
		Class<?> received=(Class<?>)ois.readObject();
		ois.close();
		s.close();
		ss.close();
		System.out.println("SERVER:Classe ricevuta, nome:"+received.getName());
	}
}
e funziona, ma quando vado ad immergere il codice nel problema reale mi da errore di
Codice:
java.rmi.UnmarshalException: error unmarshalling return
, il codice del Server è
Codice:
private Class<?> transferFromRemote(String name,InetAddress addr) throws ClassNotFoundException{
            try {
                Socket s = new Socket(addr, 666);
                
                PrintWriter pw = new PrintWriter(s.getOutputStream());
                pw.println(name); //trasferisco il nome della classe
                pw.flush();
                
                InputStreamReader isr=new InputStreamReader(s.getInputStream());
                BufferedReader br=new BufferedReader(isr);
                if (!br.readLine().equals("SI")){ //MODIFICATO
                        br.close();
                        isr.close();
                        s.close();
                            System.out.println("il Client non conosce la classe");
                        throw new ClassNotFoundException(name);
                }
                
                    System.out.println("Il Client conosce la classe");
                ObjectInputStream ois=new ObjectInputStream(s.getInputStream());
                    System.out.println("ObjectInputStream creato");
                
                Class<?> ret=(Class<?>) ois.readObject();
                    System.out.println("Classe ricevuta, addio");
                pw.close();
                br.close();
                isr.close();
                ois.close();
                s.close();

                return ret;
            } catch (IOException ex) {
                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                throw new ClassNotFoundException(name);
            }
        }
mentre il codice del client è
Codice:
public void run(){
            try {
                    System.out.println("Richiesta Classe ricevuta");
                InputStreamReader isr = new InputStreamReader(this.s.getInputStream());
                BufferedReader br = new BufferedReader(isr);
                String nomeClasse = br.readLine(); //mi prendo il nome della classe
                    System.out.println("Nome classe Ricevuto (" + nomeClasse + ")");
                
                PrintWriter pw=new PrintWriter(s.getOutputStream());
                try{
                    Class<?> toSend=Class.forName(nomeClasse);
                    pw.println("SI");
                    pw.flush();
                        System.out.println("Conosco la calsse, la mando");
                    ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());
                        System.out.println("ObjectOutputStream creato, classe ("+toSend.getName()+")");
                    oos.writeObject(toSend);
                    oos.flush();
                        System.out.println("Classe mandata, chiudo tutto");
                    oos.close();
                    pw.close();
                    br.close();
                    isr.close();
                    s.close();
                } catch (ClassNotFoundException ex){
                    pw.println("NO");
                    pw.flush();
                    pw.close();
                    br.close();
                    isr.close();
                    s.close();
                }
            } catch (IOException ex) {
                Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
nel client la variabile s è di tipo Socket ed il metodo è dentro un Runnable avviato come nuovo thread, il problema si presenta nel fatto che la System.out.println("ObjectInputStream creato"); la stampa mentre la System.out.println("Classe ricevuta, addio"); no (nel server) mentre nel client stampa fino all'ultima System.out. Ribadisco che la classe TestClassLoader funziona normalmente!!! (Il codice concettualmente è uguale)
Altra cosa che non mi spiego è il java.rmi.UnmarshalException , il codice del server è messo dentro un ClassLoader moddato che dovrebbe caricare la classe non locale (e correttamente settato come ClassLoader) e il metodo che andrebbe a chiamare il classloader (indirettamente off course) è chiamato tramite RMI, qualche lume?
__________________
CPU: Intel Core 2 Quad Q6600 - Mobo: Asus P5E - RAM:4x2GB DDR2 - sk video: Power Color ATI Radeon HD3870 - HD:Western Digital 750GB
morskott è offline   Rispondi citando il messaggio o parte di esso
Old 23-02-2008, 20:31   #2
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7258
gli oggetti che passi devono implementare l'interfaccia Serializable e quindi essere serializzabili
immagino sia questo il problema
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 23-02-2008, 21:17   #3
morskott
Member
 
Iscritto dal: Jul 2005
Messaggi: 291
Class, come riporta javadoc, implementa l'interfaccia Serializable, e poi non si spiegherebbe perchè col programma di prova funziona
__________________
CPU: Intel Core 2 Quad Q6600 - Mobo: Asus P5E - RAM:4x2GB DDR2 - sk video: Power Color ATI Radeon HD3870 - HD:Western Digital 750GB
morskott è offline   Rispondi citando il messaggio o parte di esso
Old 23-02-2008, 21:33   #4
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7258
qual'è esattamente la riga di codice che genera l'eccezione?
è proprio oos.writeObject(toSend); ?
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 23-02-2008, 22:11   #5
morskott
Member
 
Iscritto dal: Jul 2005
Messaggi: 291
Quote:
Originariamente inviato da k0nt3 Guarda i messaggi
qual'è esattamente la riga di codice che genera l'eccezione?
è proprio oos.writeObject(toSend); ?
La System.out successiva alla write la stampa, quindi la riga la esegue senza fare eccezzioni, quello che non fa è la
Codice:
Class<?> ret=(Class<?>) ois.readObject();
perchè la System.out subito successiva non la fa
__________________
CPU: Intel Core 2 Quad Q6600 - Mobo: Asus P5E - RAM:4x2GB DDR2 - sk video: Power Color ATI Radeon HD3870 - HD:Western Digital 750GB
morskott è offline   Rispondi citando il messaggio o parte di esso
Old 24-02-2008, 03:18   #6
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
così ad occhio, dato che stai usando java > 5, direi che non hai impostato correttamente la codebase del server.
Poteva anche essere che non avevi compilato gli stub, ma da java 5 in poi vengono generati automaticamente quindi il problema è quello che ho appena scritto
Dai un occhio alla configurazione del server (o registro o come cavolo si chiama che non mi ricordo ) RMI
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 25-02-2008, 20:48   #7
morskott
Member
 
Iscritto dal: Jul 2005
Messaggi: 291
Anche se non prettamente legato all'inizio del thread lo ripropongo perchè il problema da risolvere è lo stesso.
Un'altra idea che mi è venuta in mente è da parte Client esportare un metodo (RMI)
Codice:
public byte[] getServerUnknowClass(String className) throws RemoteException,ClassNotFoundException {
        try {
                System.out.println("Il server non conosce la classe " + className);
            Class<?> classe = Class.forName(className);
                System.out.println("Io conosco la classe");
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(classe);
            oos.flush();
            oos.close();
            byte[] ret = baos.toByteArray();
                System.out.println("Generato l'array di bytes contenente la def della classe, mando");
            return ret;
        } catch (IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
            throw new ClassNotFoundException(className);
        }
    }
per poi da parte server fare
Codice:
public Class<?> findClass(String name) throws ClassNotFoundException{
            {
                try {
                    System.out.println("Non conosco la classe " + name + ", la chiedo al client");
                    byte[] classeDaClient = this.client.getServerUnknowClass(name);
                        System.out.println("Il client mi ha dato il flusso di bytes");
                    ByteArrayInputStream bais = new ByteArrayInputStream(classeDaClient);
                    ObjectInputStream ois = new ObjectInputStream(bais);
                    Class<?> ret = defineClass(name, classeDaClient, 0, classeDaClient.length);;
                        System.out.println("Classe acquisita");
                    ois.close();
                    bais.close();
                    
                        System.out.println("Classe ricevuta dal client");
                    return ret;
                } catch (RemoteException ex) {
                    Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                    throw new ClassNotFoundException(name);
                }catch (IOException ex) {
                    Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                    throw new ClassNotFoundException(name);
                } 
            }
         }
(i ByteArrayInputStream e ObjectInputStream sono di una prova precedente in cui la classe la prendevo con una "ois.readObject()" (che mi dava il solito errore)) passando tra i 2 componenti i bytes della classe mandandoli (i bytes della classe) in pasto alla "defineClass" (metodo della classe ClassLoader a cui accedo perchè la estendo (public class MioClassLoader extends ClassLoader)), adesso però ho l'eccezione "java.lang.ClassFormatError:incompatible magic value 2901213189 in class file blabla" che penso sia generata dal fatto che l'ObjectOutputStream "sporchi" il flusso di bytes della classe vera e propria.

Però facendo un piccolo programma di esempio
Codice:
public class TestClassLoader{
	
	public static void main(String[] args) throws Exception{
		String nomeClasse=args[0];
		String nomeFile=args[1];
		Class<?> cc=Class.forName(nomeClasse);
		ByteArrayOutputStream baos=new ByteArrayOutputStream();
		ObjectOutputStream oos=new ObjectOutputStream(baos);
		oos.writeObject(cc);
		oos.close();
		baos.close();
		byte[] byteDaBaos=baos.toByteArray();
		FileInputStream fis=new FileInputStream(nomeFile);
		List<Byte> listaBytes=new ArrayList<Byte>();
		int read=fis.read();
		while (read!=-1){
			listaBytes.add(new Byte((byte)read));
			read=fis.read();
		}
		fis.close();
		Object[] byteDaFile=listaBytes.toArray();
		System.out.println("Bytes dalla classe\n"+Arrays.toString(byteDaBaos));
		System.out.println("Bytes dal file\n"+Arrays.toString(byteDaFile));
	}
}
mi vengono outputs molto discordi!!!
Codice:
Bytes dalla classe
[-84, -19, 0, 5, 118, 114, 0, 9, 88, 109, 108, 80, 97, 114, 115, 101, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 112]
Bytes dal file
[-54, -2, -70, -66, 0, 0, 0, 50, 0, 120, 10, 0, 29, 0, 51, 10, 0, 52, 0, 53, 10, 0, 52, 0, 54, 10, 0, 55, 0, 56, 9, 0, 22, 0, 57, 7, 0, 58, 10, 0, 6, 0, 59, 11, 0, 60, 0, 61, 8, 0, 62, 10, 0, 22, 0, 63, 7, 0, 64, 8, 0, 65, 10, 0, 11, 0, 66, 8, 0, 67, 8, 0, 68, 11, 0, 69, 0, 70, 11, 0, 69, 0, 71, 10, 0, 72, 0, 73, 11, 0, 69, 0, 74, 11, 0, 75, 0, 76, 11, 0, 75, 0, 77, 7, 0, 78, 7, 0, 79, 10, 0, 23, 0, 66, 10, 0, 22, 0, 80, 9, 0, 81, 0, 82, 10, 0, 22, 0, 83, 10, 0, 84, 0, 85, 7, 0, 86, 1, 0, 8, 100, 111, 99, 117, 109, 101, 110, 116, 1, 0, 22, 76, 111, 114, 103, 47, 119, 51, 99, 47, 100, 111, 109, 47, 68, 111, 99, 117, 109, 101, 110, 116, 59, 1, 0, 6, 60, 105, 110, 105, 116, 62, 1, 0, 17, 40, 76, 106, 97, 118, 97, 47, 105, 111, 47, 70, 105, 108, 101, 59, 41, 86, 1, 0, 4, 67, 111, 100, 101, 1, 0, 15, 76, 105, 110, 101, 78, 117, 109, 98, 101, 114, 84, 97, 98, 108, 101, 1, 0, 13, 83, 116, 97, 99, 107, 77, 97, 112, 84, 97, 98, 108, 101, 7, 0, 78, 7, 0, 79, 7, 0, 58, 1, 0, 16, 103, 101, 116, 78, 97, 109, 105, 110, 103, 83, 101, 114, 118, 105, 99, 101, 1, 0, 20, 40, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 7, 0, 87, 7, 0, 88, 1, 0, 5, 103, 101, 116, 78, 83, 1, 0, 56, 40, 76, 111, 114, 103, 47, 119, 51, 99, 47, 100, 111, 109, 47, 78, 111, 100, 101, 59, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 76, 111, 114, 103, 47, 119, 51, 99, 47, 100, 111, 109, 47, 78, 111, 100, 101, 59, 7, 0, 89, 1, 0, 4, 109, 97, 105, 110, 1, 0, 22, 40, 91, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 86, 1, 0, 10, 83, 111, 117, 114, 99, 101, 70, 105, 108, 101, 1, 0, 14, 88, 109, 108, 80, 97, 114, 115, 101, 114, 46, 106, 97, 118, 97, 12, 0, 32, 0, 90, 7, 0, 91, 12, 0, 92, 0, 93, 12, 0, 94, 0, 95, 7, 0, 96, 12, 0, 97, 0, 98, 12, 0, 30, 0, 31, 1, 0, 19, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 69, 120, 99, 101, 112, 116, 105, 111, 110, 12, 0, 99, 0, 90, 7, 0, 100, 12, 0, 101, 0, 102, 1, 0, 6, 67, 111, 110, 102, 105, 103, 12, 0, 44, 0, 45, 1, 0, 26, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 82, 117, 110, 116, 105, 109, 101, 69, 120, 99, 101, 112, 116, 105, 111, 110, 1, 0, 18, 78, 111, 110, 32, 116, 114, 111, 118, 111, 32, 67, 111, 110, 102, 105, 103, 33, 33, 12, 0, 32, 0, 103, 1, 0, 13, 78, 97, 109, 105, 110, 103, 83, 101, 114, 118, 105, 99, 101, 1, 0, 25, 78, 111, 110, 32, 116, 114, 111, 118, 111, 32, 110, 97, 109, 105, 110, 103, 83, 101, 114, 118, 105, 99, 101, 33, 33, 7, 0, 88, 12, 0, 104, 0, 41, 12, 0, 105, 0, 41, 7, 0, 106, 12, 0, 107, 0, 108, 12, 0, 109, 0, 110, 7, 0, 89, 12, 0, 111, 0, 112, 12, 0, 113, 0, 114, 1, 0, 9, 88, 109, 108, 80, 97, 114, 115, 101, 114, 1, 0, 12, 106, 97, 118, 97, 47, 105, 111, 47, 70, 105, 108, 101, 12, 0, 32, 0, 33, 7, 0, 115, 12, 0, 116, 0, 117, 12, 0, 40, 0, 41, 7, 0, 118, 12, 0, 119, 0, 103, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98, 106, 101, 99, 116, 1, 0, 19, 111, 114, 103, 47, 119, 51, 99, 47, 100, 111, 109, 47, 69, 108, 101, 109, 101, 110, 116, 1, 0, 16, 111, 114, 103, 47, 119, 51, 99, 47, 100, 111, 109, 47, 78, 111, 100, 101, 1, 0, 20, 111, 114, 103, 47, 119, 51, 99, 47, 100, 111, 109, 47, 78, 111, 100, 101, 76, 105, 115, 116, 1, 0, 3, 40, 41, 86, 1, 0, 40, 106, 97, 118, 97, 120, 47, 120, 109, 108, 47, 112, 97, 114, 115, 101, 114, 115, 47, 68, 111, 99, 117, 109, 101, 110, 116, 66, 117, 105, 108, 100, 101, 114, 70, 97, 99, 116, 111, 114, 121, 1, 0, 11, 110, 101, 119, 73, 110, 115, 116, 97, 110, 99, 101, 1, 0, 44, 40, 41, 76, 106, 97, 118, 97, 120, 47, 120, 109, 108, 47, 112, 97, 114, 115, 101, 114, 115, 47, 68, 111, 99, 117, 109, 101, 110, 116, 66, 117, 105, 108, 100, 101, 114, 70, 97, 99, 116, 111, 114, 121, 59, 1, 0, 18, 110, 101, 119, 68, 111, 99, 117, 109, 101, 110, 116, 66, 117, 105, 108, 100, 101, 114, 1, 0, 37, 40, 41, 76, 106, 97, 118, 97, 120, 47, 120, 109, 108, 47, 112, 97, 114, 115, 101, 114, 115, 47, 68, 111, 99, 117, 109, 101, 110, 116, 66, 117, 105, 108, 100, 101, 114, 59, 1, 0, 33, 106, 97, 118, 97, 120, 47, 120, 109, 108, 47, 112, 97, 114, 115, 101, 114, 115, 47, 68, 111, 99, 117, 109, 101, 110, 116, 66, 117, 105, 108, 100, 101, 114, 1, 0, 5, 112, 97, 114, 115, 101, 1, 0, 38, 40, 76, 106, 97, 118, 97, 47, 105, 111, 47, 70, 105, 108, 101, 59, 41, 76, 111, 114, 103, 47, 119, 51, 99, 47, 100, 111, 109, 47, 68, 111, 99, 117, 109, 101, 110, 116, 59, 1, 0, 15, 112, 114, 105, 110, 116, 83, 116, 97, 99, 107, 84, 114, 97, 99, 101, 1, 0, 20, 111, 114, 103, 47, 119, 51, 99, 47, 100, 111, 109, 47, 68, 111, 99, 117, 109, 101, 110, 116, 1, 0, 18, 103, 101, 116, 68, 111, 99, 117, 109, 101, 110, 116, 69, 108, 101, 109, 101, 110, 116, 1, 0, 23, 40, 41, 76, 111, 114, 103, 47, 119, 51, 99, 47, 100, 111, 109, 47, 69, 108, 101, 109, 101, 110, 116, 59, 1, 0, 21, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 86, 1, 0, 14, 103, 101, 116, 84, 101, 120, 116, 67, 111, 110, 116, 101, 110, 116, 1, 0, 11, 103, 101, 116, 78, 111, 100, 101, 78, 97, 109, 101, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 1, 0, 6, 101, 113, 117, 97, 108, 115, 1, 0, 21, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98, 106, 101, 99, 116, 59, 41, 90, 1, 0, 13, 103, 101, 116, 67, 104, 105, 108, 100, 78, 111, 100, 101, 115, 1, 0, 24, 40, 41, 76, 111, 114, 103, 47, 119, 51, 99, 47, 100, 111, 109, 47, 78, 111, 100, 101, 76, 105, 115, 116, 59, 1, 0, 9, 103, 101, 116, 76, 101, 110, 103, 116, 104, 1, 0, 3, 40, 41, 73, 1, 0, 4, 105, 116, 101, 109, 1, 0, 21, 40, 73, 41, 76, 111, 114, 103, 47, 119, 51, 99, 47, 100, 111, 109, 47, 78, 111, 100, 101, 59, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 121, 115, 116, 101, 109, 1, 0, 3, 111, 117, 116, 1, 0, 21, 76, 106, 97, 118, 97, 47, 105, 111, 47, 80, 114, 105, 110, 116, 83, 116, 114, 101, 97, 109, 59, 1, 0, 19, 106, 97, 118, 97, 47, 105, 111, 47, 80, 114, 105, 110, 116, 83, 116, 114, 101, 97, 109, 1, 0, 7, 112, 114, 105, 110, 116, 108, 110, 0, 33, 0, 22, 0, 29, 0, 0, 0, 1, 0, 2, 0, 30, 0, 31, 0, 0, 0, 4, 0, 1, 0, 32, 0, 33, 0, 1, 0, 34, 0, 0, 0, 118, 0, 3, 0, 5, 0, 0, 0, 33, 42, -73, 0, 1, -72, 0, 2, 77, 44, -74, 0, 3, 78, 42, 45, 43, -74, 0, 4, -75, 0, 5, -89, 0, 10, 58, 4, 25, 4, -74, 0, 7, -79, 0, 1, 0, 4, 0, 22, 0, 25, 0, 6, 0, 2, 0, 35, 0, 0, 0, 34, 0, 8, 0, 0, 0, 8, 0, 4, 0, 12, 0, 8, 0, 13, 0, 13, 0, 14, 0, 22, 0, 18, 0, 25, 0, 15, 0, 27, 0, 16, 0, 32, 0, 19, 0, 36, 0, 0, 0, 19, 0, 2, -1, 0, 25, 0, 2, 7, 0, 37, 7, 0, 38, 0, 1, 7, 0, 39, 6, 0, 1, 0, 40, 0, 41, 0, 1, 0, 34, 0, 0, 0, 126, 0, 3, 0, 4, 0, 0, 0, 59, 42, -76, 0, 5, -71, 0, 8, 1, 0, 76, 43, 18, 9, -72, 0, 10, 77, 44, -57, 0, 13, -69, 0, 11, 89, 18, 12, -73, 0, 13, -65, 44, 18, 14, -72, 0, 10, 78, 45, -57, 0, 13, -69, 0, 11, 89, 18, 15, -73, 0, 13, -65, 45, -71, 0, 16, 1, 0, -80, 0, 0, 0, 2, 0, 35, 0, 0, 0, 26, 0, 6, 0, 0, 0, 29, 0, 10, 0, 30, 0, 17, 0, 31, 0, 31, 0, 32, 0, 38, 0, 33, 0, 52, 0, 34, 0, 36, 0, 0, 0, 17, 0, 2, -3, 0, 31, 7, 0, 42, 7, 0, 43, -4, 0, 20, 7, 0, 43, 0, 10, 0, 44, 0, 45, 0, 1, 0, 34, 0, 0, 0, -92, 0, 2, 0, 5, 0, 0, 0, 83, 42, -57, 0, 5, 1, -80, 42, -71, 0, 17, 1, 0, 43, -74, 0, 18, -103, 0, 5, 42, -80, 42, -71, 0, 19, 1, 0, 77, 3, 62, 29, 44, -71, 0, 20, 1, 0, -94, 0, 44, 44, 29, -71, 0, 21, 2, 0, 43, -72, 0, 10, 58, 4, 25, 4, -58, 0, 20, 25, 4, -71, 0, 17, 1, 0, 43, -74, 0, 18, -103, 0, 6, 25, 4, -80, -124, 3, 1, -89, -1, -48, 1, -80, 0, 0, 0, 2, 0, 35, 0, 0, 0, 42, 0, 10, 0, 0, 0, 38, 0, 6, 0, 39, 0, 19, 0, 40, 0, 21, 0, 42, 0, 28, 0, 43, 0, 40, 0, 44, 0, 53, 0, 45, 0, 72, 0, 46, 0, 75, 0, 43, 0, 81, 0, 49, 0, 36, 0, 0, 0, 15, 0, 5, 6, 14, -3, 0, 8, 7, 0, 46, 1, 44, -6, 0, 5, 0, 9, 0, 47, 0, 48, 0, 1, 0, 34, 0, 0, 0, 61, 0, 6, 0, 2, 0, 0, 0, 29, -69, 0, 22, 89, -69, 0, 23, 89, 42, 3, 50, -73, 0, 24, -73, 0, 25, 76, -78, 0, 26, 43, -74, 0, 27, -74, 0, 28, -79, 0, 0, 0, 1, 0, 35, 0, 0, 0, 14, 0, 3, 0, 0, 0, 54, 0, 18, 0, 55, 0, 28, 0, 56, 0, 1, 0, 49, 0, 0, 0, 2, 0, 50]
quindi mi pare che manco questa strada è percorribile!!!!
Non c'è magari un metodo che dato il nome di una classe mi ritorni il file .class cui è definita?????
__________________
CPU: Intel Core 2 Quad Q6600 - Mobo: Asus P5E - RAM:4x2GB DDR2 - sk video: Power Color ATI Radeon HD3870 - HD:Western Digital 750GB

Ultima modifica di morskott : 25-02-2008 alle 20:53.
morskott è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 18:02   #8
caltpp
Junior Member
 
Iscritto dal: Mar 2008
Messaggi: 1
ciao, volevo chiederti se avevi trovato una soluzione per il tuo caso. io ho un problema simile. devo instanziare una classe (usando il defineClass) partendo da un'array di byte che recupero da un file xml, ma lancia un'eccezione del tipo: "java.lang.ClassFormatError: Incompatible magic value 1668246830 in class file MiaClasse"
caltpp è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 19:47   #9
morskott
Member
 
Iscritto dal: Jul 2005
Messaggi: 291
Il problema l'ho risolto passando dal server al client la string del nome del file, poi il client cerca il file contenente quella classe (sostituisco ad ogni punto della stringa "\" e ci postpongo ".class" e cerco questo file nella cartella corrente o nel classpath), lo apre e passa al server i bytes del file, il server manda il tutto in pasto al defineClass()
Codice:
public byte[] getServerUnknowClass(String className) throws RemoteException,ClassNotFoundException {
        try {
                System.out.println("Richiesta della classe:"+className);
            String path=sostituisci(className,".",File.separator)+".class";
                System.out.println("Nome del file class:"+path);
            File f=new File(path);
            if (f.exists()){
                    System.out.println("Il file esiste, lo mando");
                RandomAccessFile raf=new RandomAccessFile(f,"r");
                byte[] ret=new byte[(int)raf.length()];
                raf.read(ret);
                     System.out.println("Il flusso di bytes è\n"+Arrays.toString(ret));
                raf.close();
                    System.out.println("Mando tutto");
                return ret;
            }else{
                    System.out.println("Il file non esiste, cerco nel classpath");
                String classPath=System.getProperty("CLASSPATH");
                StringTokenizer st=new StringTokenizer(classPath,File.pathSeparator);
                while (st.hasMoreTokens()){
                    File theFile=new File(st.nextToken()+File.separator+path);
                        System.out.println("Provo il file:"+theFile.getPath());
                    if (theFile.exists()){
                            System.out.println("Il file esiste, lo mando");
                        RandomAccessFile raf=new RandomAccessFile(f,"r");
                        byte[] ret=new byte[(int)raf.length()];
                        raf.read(ret);
                            System.out.println("Il flusso di bytes è\n"+Arrays.toString(ret));
                        raf.close();
                        return ret;
                    }
                }
            }
                System.out.println("Non trovo la classe");
            throw new ClassNotFoundException(className);
        } catch (IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
            throw new ClassNotFoundException(className);
        }
    }

    private String sostituisci(String className, String string, String separator) {
        StringTokenizer st=new StringTokenizer(className,string);
        String ret=st.nextToken();
        while (st.hasMoreTokens()){
            ret+=separator+st.nextToken();
        }
        return ret;
    }
per il Client e
Codice:
public Class<?> findClass(String name) throws ClassNotFoundException{
            {
                try {
                        System.out.println("Non conosco la classe " + name + ", la chiedo al client");
                    byte[] classeDaClient = this.client.getServerUnknowClass(name);
                        System.out.println("Il client mi ha dato il flusso di bytes\n"+Arrays.toString(classeDaClient));
                    Class<?> ret = defineClass(name, classeDaClient, 0, classeDaClient.length);
                        System.out.println("Classe acquisita");
                    return ret;
                } catch (RemoteException ex) {
                    Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                    throw new ClassNotFoundException(name);
                }catch (IOException ex) {
                    Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                    throw new ClassNotFoundException(name);
                } 
            }
         }
per il server
__________________
CPU: Intel Core 2 Quad Q6600 - Mobo: Asus P5E - RAM:4x2GB DDR2 - sk video: Power Color ATI Radeon HD3870 - HD:Western Digital 750GB
morskott è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce Recensione Pura 80 Pro: HUAWEI torna a stupire c...
Opera Neon: il browser AI agentico di nuova generazione Opera Neon: il browser AI agentico di nuova gene...
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
Verso la fine della TV tradizionale? I g...
Cassa JBL a 39€, portatili, smartphone, ...
Cometa interstellare 3I/ATLAS: la sonda ...
Jensen Huang e Bill Dally di NVIDIA prem...
Il futuro della birra è green: H...
ECOVACS GOAT G1-2000: il robot tagliaerb...
Allarme sui bus elettrici cinesi: centin...
iPhone Fold sempre più vicino: fo...
Soundbar Samsung da 150W con subwoofer i...
Tensione tra Nexperia e la controllata c...
Samsung e il futuro della smart cleaning...
Tinder: ecco come userà l'IA (e l...
Oltre 55.000 dollari solo per il raffred...
Microsoft e tecnologia immorale: i dipen...
Come stanno andando Fastweb e Vodafone d...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:39.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v