每次ping都返回ping结果,而不仅仅是最终

时间:2013-09-30 15:41:43

标签: java ping

即时为朋友做一个小桌面应用程序做ping,它“有效”,我计划使用ping -t(用于无限ping),但是就像我做的那样,它永远不会显示结果,因为它只在完成时返回,我必须更改/添加以在“jtextField”中添加每个结果

看看我有什么:

执行ping并返回结果的方法(resposta)。

    public String pingar(String ip){  
        String resposta="";  
        String comando="ping -t "+ip;  
        try {  
            Scanner S = new Scanner( Runtime.getRuntime().exec(comando).getInputStream());    
            while(S.hasNextLine()) {    
               resposta+=S.nextLine()+"\n"; 
            }  
        } catch (IOException ex) {  
            ex.printStackTrace();  
        }  
        return resposta;  
    }  

启动上述方法并使用方法adicionaresultado追加结果(resposta)的方法         public void ativaoping(){             adicionaresultado((pingar(tfIp.getText())));             }

更改/附加文本的方法,并将滚动的位置设置为结尾

    public void adicionaresultado(String resposta) { 
        taResultados.append(resposta);
taResultados.setCaretPosition(taResultados.getDocument().getLength());  
        //tfResultado.setText(tfResultado.getText() + "\n" + resposta);
    }
}

但我的问题是它只返回并在完成ping时添加文本,所以我永远无法使用ping -t

4 个答案:

答案 0 :(得分:1)

您希望将文本添加到事件队列上的JTextArea。我在后面的代码示例中提供了一个非常基本的示例。这会在JTextArea中为ping命令的响应添加一个新行。它不漂亮,但它可以满足您的需求。 此外,您希望将无限的ping操作放入单独的runnable中,以便稍后可以将其杀死,并在执行程序中运行它,这样您就可以更好地控制如何杀死它。

package test;

import java.awt.EventQueue;
import java.io.IOException;
import java.util.Scanner;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class Pinger {

    /**
     * @param args
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                Pinger pinger = new Pinger();
                JFrame frame = new JFrame();
                JPanel panel = new JPanel();
                frame.setSize(300, 400);
                frame.add(panel);
                JTextArea textArea = new JTextArea();
                panel.add(textArea);
                frame.setVisible(true);
                pinger.executor.execute(pinger.createRunnable("google.com",
                        textArea));
            }
        });

    }

    private Runnable createRunnable(final String ip, final JTextArea area) {
        return new Runnable() {
            public void run() {
                String resposta = "";
                String comando = "ping -t " + ip;

                try {
                    Scanner S = new Scanner(Runtime.getRuntime().exec(comando)
                            .getInputStream());
                    while (S.hasNextLine()) {
                        final String newText = S.nextLine();
                        EventQueue.invokeLater(new Runnable() {
                            public void run() {
                                area.setText(area.getText()
                                        + System.getProperty("line.separator")
                                        + newText);
                            }
                        });

                    }
                } catch (IOException ex) {
                    ex.printStackTrace();
                }

            }
        };
    }

    Executor executor = Executors.newFixedThreadPool(1);

}

答案 1 :(得分:0)

每次流中都有新行时调用adicionaResultado

while(S.hasNextLine()) {    
    adicionaResultado(S.nextLine()+"\n");
}

答案 2 :(得分:0)

一个方法只能返回一次,所以这个技巧会做

           while(S.hasNextLine()) {    
               System.out.print(S.nextLine()+"\n"); 
            }  

答案 3 :(得分:0)

替换它:" ping -t" + ip; 对于 this:String comando =" ping -n 10" + ip;