Tenho um aplicativo que se conecta a uma plataforma utilizando a API da Apache commons e realiza algumas verificações no sistema. Preciso enviar crtl+c para interromper uma execução. Como faço isso em java? Alguém pode me ajudar?
Cara, não sei se rola muito fazer isso em Java. Na API do Windows existe a função GenerateConsoleCtrlEvent e com ela mandar um Ctrl + C para o processo. Não sei nem se você conseguiria capturar o evento associado à tecla Ctrl no Java.
leoramos
Cara, deixa fazer uma pergunta: é pra TELNET, ok, mas tá fazendo que testes?
Eu tô perguntando pq neste EXATO momento, eu tô fazendo uma extensão de uma classe da Apache Commons Net, justamente porquê preciso de informações intermediárias dos comandos, que a API não provê.
Dependendo do que estiveres fazendo, o que tô fazendo aqui pode te servir.
Abraço!
matheuslmota
Cara, você pode enviar o caracter Ctrl-C para o seu processo da seguinte forma:
EDIT: Fiz um algoritmo usando KeyListener que envia um caracter end-of-text para o processo caso Ctrl+C seja pressionado.
importjava.awt.event.KeyEvent;importjava.awt.event.KeyListener;importjava.io.BufferedWriter;importjava.io.IOException;importjava.io.OutputStreamWriter;importjavax.swing.JFrame;importjavax.swing.JOptionPane;importjavax.swing.JTextArea;publicclassCtrlCimplementsKeyListener{privateProcessprocess;staticJTextAreaarea;booleant1=false,t2=false;publicstaticvoidmain(String[]args)throwsIOException{CtrlCctrlC=newCtrlC();ctrlC.process=Runtime.getRuntime().exec("processo");JFrameframe=newJFrame();area=newJTextArea();area.addKeyListener(ctrlC);frame.add(area);frame.setSize(500,800);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}@OverridepublicvoidkeyPressed(KeyEvente){if(e.getKeyCode()==KeyEvent.VK_CONTROL)t1=true;if(e.getKeyCode()==KeyEvent.VK_C)t2=true;if(t1&&t2){BufferedWriterbufferedWriter=newBufferedWriter(newOutputStreamWriter(process.getOutputStream()));try{bufferedWriter.write((char)3);bufferedWriter.flush();bufferedWriter.close();}catch(IOExceptione1){// TODO Auto-generated catch blocke1.printStackTrace();}t1=false;t2=false;}}@OverridepublicvoidkeyReleased(KeyEvente){if(e.getKeyCode()==KeyEvent.VK_CONTROL)t1=false;if(e.getKeyCode()==KeyEvent.VK_C)t2=false;}@OverridepublicvoidkeyTyped(KeyEvente){}}
Você pode usar esse TextArea para digitar comandos e pegar a saída dos seus processos. Faça algumas pequenas modificações para usar o TextArea como um prompt.
vittorino
Cara, deixa fazer uma pergunta: é pra TELNET, ok, mas tá fazendo que testes?
Eu tô perguntando pq neste EXATO momento, eu tô fazendo uma extensão de uma classe da Apache Commons Net, justamente porquê preciso de informações intermediárias dos comandos, que a API não provê.
Dependendo do que estiveres fazendo, o que tô fazendo aqui pode te servir.
Abraço!
Bom, minha aplicação conecta a uma plataforma através telnet (commons-net) executa uma sequência de comandos e um desses comandos altera a linha de comando de uma tarefa, nisso eu preciso simular o evento ctrl+c, daí a aplicação é questionada: alterar? sim ou não. Eu preciso do evento que é gerado quando precionado ctrl+c, pois a aplicação não recebe esse evento do teclado.
matheuslmota
vittorino:
Cara, deixa fazer uma pergunta: é pra TELNET, ok, mas tá fazendo que testes?
Eu tô perguntando pq neste EXATO momento, eu tô fazendo uma extensão de uma classe da Apache Commons Net, justamente porquê preciso de informações intermediárias dos comandos, que a API não provê.
Dependendo do que estiveres fazendo, o que tô fazendo aqui pode te servir.
Abraço!
Bom, minha aplicação conecta a uma plataforma através telnet (commons-net) executa uma sequência de comandos e um desses comandos altera a linha de comando de uma tarefa, nisso eu preciso simular o evento ctrl+c, daí a aplicação é questionada: alterar? sim ou não. Eu preciso do evento que é gerado quando precionado ctrl+c, pois a aplicação não recebe esse evento do teclado.
Por acaso você leu o que eu postei?
vittorino
Blz Matheus!?
Eu vi sim seu comentário, eu tinha testado e está apresentado erro:
ahuahuahua
Cara, “process” foi um nome genérico que eu coloquei, você deve substituir process ou por um comando que você irá rodar remotamente ou então por um shell script. Sendo que se você for rodar um shell script, rode da seguinte foma: