PDA

View Full Version : [JAVA] problema con l'input (metodo readLine() )


javacomelava
03-02-2010, 17:37
Salve

Ho un applicazione che per effettuare l'input utilizza il metodo readLine() di
BufferReader.

Il problema è che:

Se lancio l'applicazione da netBeans non ho alcun tipi di problema.
Se lancio l'applicazione da msdos(attraverso un jar che ho creato) il suddetto metodo comincia a darmi problemi.

Il problema è che readLine(),che dovrebbe aspettare che l'utente digiti qualcosa e prema INVIO,non aspetta l'input e va avanti con l'esecuzione del programma.

Ma poi perche se lancio da NetBeans tutto funziona a meraviglia e se lancio da dos tutto va a farsi fregare? Misteri della fede!

Qualcuno che riesce ad illuminarmi ?


if (sp != null) {
System.out.println("INIZIALIZAZIONE SCANNER PACCHETTI!");
Pcap pcap = Pcap.openLive(netDevice.getName(), sp.getQuantiByte(), sp.getFlag(), sp.getTimeout(), errors);

/* Controllo sulla variabile pcap: Se pcap=null allora si è verificato qualche problema nell'apertura del
* device.Gli errori saranno inseriti nel buffer apposito errors,e quindi stampati a schermo */
if (pcap == null) {
System.err.printf("ERRORE NELL'APERTURA DEL DEVICE: " + errors);
}

/* 'espressione' è una stringa contenente il filtro da applicare */
System.out.println("Per la sintassi sui filtri: *** http://www.tcpdump.org/tcpdump_man.html ***\n");
System.out.println("Inserisci il filto per la sessione di sniffing corrente:");

//BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(input);
String espressione = new String();
try {
System.out.println("Specifica il filtro:\n");
espressione = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Premi INVIO per procedere");

/* La classe PcapBpfProgram rappresenta un'istanza di un BARKLEY PACKET FILTER PROGRAM */
PcapBpfProgram program = new PcapBpfProgram();
int ottimizazione = 1; // 0 = false (Senza Ottimizazione)
int netmask = 0; // 0 = non specificata.Questa opzione serve a fare ricavare l'indirizzo di broadcast

/* Il metodo:
*
* compile(PcapBpfProgram program,String str,int optimize,int netmask);
*
* della classe Pcap.Il metodo compila un programma BPF,impostando un filtro,l'ottimizazione e la netmask.
*
* Compila un packet filter,convertendo l'espressione che rappresenta il filtro ad altro livello
* in un programma che può essere interpretato dal filto a livello kernel.(Definizione delle API).
*
*/
if (pcap.compile(program, espressione, ottimizazione, netmask) != Pcap.OK) {
System.err.println(pcap.getErr());
return;
}

/* La costante Ok è una costante di classe Pcap e vale 0 */
if (pcap.setFilter(program) != Pcap.OK) {
System.err.println(pcap.getErr());
return;
}

/* Avverte l'utente dell'avvenuta applicazione del filto */
System.out.println("Il filtro è stato applicato con successo: " + espressione);

JPacketHandler<String> handler = new JPacketHandler<String>() {

int c = 0;

public void nextPacket(JPacket pacchetto, String usr) {
System.out.println(usr + c + " *****");
System.out.println(pacchetto.toString());
c++;
}
};

/* Metodo che inizia il loop per lo sniffing dei pacchetti */
pcap.loop(sp.getNumPack(), handler, "***** PACCHETTO: "); // Esamina tanti pacchetti quanto vale 'numPack'
/* Chiude la sessione */
pcap.close();
}

Sfasciacarene
03-02-2010, 23:36
Non puoi provare a utilizzare Scanner e nextLine e hasNext etc?
alla breve:
import java.util.scanner;/*(inizio)*/
Scanner input = new Scanner(System.in);
String espressione = "";/*non mi piace molto quel "String = new String();"*/
espressione = input.nextLine();

Sotto terminale linux funziona?
Prova a contrallare le versioni del JDK, avvolte sotto dos ci sono delle diversità nei metodi di input che non sotto linux, ti faccio questo esempio perchè personalmente preferisco quest'ultimo per usare java.
Spero di essere stato utile.