2009-11-10 13 views
6

Come posso analizzare e analizzare il traffico Java RMI? C'è solo una soluzione molto parziale in wireshark. Ho bisogno di sapere esattamente quali metodi sono stati chiamati e quali argomenti sono passati annusando la connessione TCP.Java RMI: necessario sniffer

risposta

4

È necessario "annusarlo" oppure è possibile distribuire un factory socket personalizzato sul client o sul server?

In passato ho creato un factory socket server RMI personalizzato che creava un "tee" nello stream letto dal servizio RMI. Poiché il runtime RMI leggeva normalmente uno degli stream, il mio codice ha ottenuto anche una copia del JRMP. Nel mio caso, stavo registrando le chiamate remote, inclusi i loro parametri in forma serializzata, in modo che potessi "riprodurle" in seguito per il test di carico. Solo abilitando le opzioni di registrazione RMI non era sufficiente per quello.

Un problema è che la documentazione JRMP è scarsa e in alcuni casi non accurata. Un altro è che gran parte del codice necessario non fa parte dell'API Java principale. È stato complicato Pensavo di aver capito bene RMI prima di iniziare, ma dopo aver fatto questo piccolo progetto, sono rimasto sorpreso di quanto avrei dovuto imparare.

Un approccio simile potrebbe essere applicato ai dati dell'applicazione catturati da Wireshark, ma non ho mai scritto un analizzatore per Wireshark e non sono sicuro di quanto sia complicato.

0

Ethereal potrebbe aiutare, ma è piuttosto basso livello.

+1

Questo è wireshark. Non aiuta troppo. Analizza solo alcune intestazioni – GabiMe

+1

Questa è una novità per me. La cosa bella è che su SO puoi imparare qualcosa anche quando rispondi a una domanda. –

5

È possibile impostare alcuni java properties per rendere rmi più dettagliato.

probabilmente bisogno di questa impostazione:

sun.rmi.client.logCalls (1.4 e versioni successive)

Se il valore di questa proprietà è vera, il logger sun.rmi.client.call sarà impostato sul livello Level.FINER. Le chiamate remote vengono registrate al livello Level.FINER e le eccezioni delle chiamate remote vengono registrate al livello Level.FINE.

0

Non so di uno strumento in grado di rilevare e decifrare il traffico RMI dal filo. Se nessun altro lo fa, una soluzione meno ottimale potrebbe essere quella di strumentare i tuoi stub/scheletri (probabilmente generati automaticamente se stai usando Java 5 o versioni successive) o parti dell'infrastruttura RMI con codice per produrre messaggi di log.

È possibile utilizzare AOP o uno strumento di manipolazione del codice byte per ottenere ciò. Ho usato JavaAssist per compiti simili ai tuoi con successo. È molto amichevole per uno strumento di questa natura.