gpt4 book ai didi

java - 如何使用java程序运行命令提示符命令?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:46:51 24 4
gpt4 key购买 nike

这是我第一次在这里发帖,所以我不太确定该说什么/问什么。无论如何,我正在尝试制作一个简单的 java 程序,它从 java 程序运行命令提示符命令,主要用于 ping flood(ping flooding 自己)。

这是我当前的代码

public class Core extends JFrame {

JTextField ipTextField;

int packets = 0;

boolean running = false;

public Core() {
super("Fatique");

Container container = getContentPane();
JButton bAttack = new JButton("Start Attack");
JButton bStop = new JButton("Stop Attack");
JPanel jPanel = new JPanel();

container.setLayout(new FlowLayout());
ipTextField = new JTextField("IP Address", 30);
container.add(ipTextField);

bAttack.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String input = ipTextField.getText();
String[] value = input.split(":");

int amountOfPackets = Integer.parseInt(value[1]);

exec("cmd /c" + input + " -t -n " + amountOfPackets);
running = true;
}
});

bStop.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
stop();
}
});

if(!running) {
jPanel.add(bAttack);
} else {
jPanel.add(bStop);
}

add(jPanel);
}

public void exec(String cmd) {
try {
Process p = Runtime.getRuntime().exec(cmd);
System.out.println(getOutput(p) + " - " + getPacketsSent());
} catch (IOException e) {
e.printStackTrace();
}
}

public String getOutput(Process p) {
String output = null;

try {
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
output = line;
packets++;
}

return output;
} catch (IOException e) {
System.err.println(e.getStackTrace());
}

return null;
}

public int getPacketsSent() {
return packets;
}

public void stop() {
exec("cmd /c break");
running = false;
}

public static void main(String[] args) {
Core c = new Core();
c.setSize(500, 300);
c.setVisible(true);
c.setResizable(false);
c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
c.setLocationRelativeTo(null);
}

我对 Java 还很陌生,所以这可能无法满足我的要求。我想要它做的是在文本字段中输入一个 ip 地址,然后用“:”拆分它,然后是数据包的数量,例如

127.0.0.1:100

虽然现在当我尝试使用那个 ip 和数据包数量时,它返回“null - 0”(从 exec 方法),我什至不确定它是否做了任何与 ping 相关的事情。

正如我已经说过的,我想要完成的是,ping flood 自己,然后输出我得到的任何响应,尽管我不知道这段代码是否做了任何与此相关的事情,我在编写 java 时主要使用逻辑.

 public String getOutput(Process p) {
String output = null;

try {
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
output = line;
packets++;
}

return output;
} catch (IOException e) {
System.err.println(e.getStackTrace());
}

return null;
}

有人能解释一下为什么我的代码不能按我希望的方式工作吗?请不要评判,正如我已经说过的,我是 Java 编程的新手。

编辑:这是对我要完成的事情的快速“信息性”解释。

  1. 我输入一个 IP 地址和我要发送的数据包数量。在这个解释中,我使用的是 localhost ip 和 5 个数据包。 About to send 5 packets to localhost ip
  2. 我开始攻击。在这部分,我想让程序运行cmd提示命令

    ping 127.0.0.1 -t -n 5

    127.0.0.1 是我在程序的文本字段中输入的 ip,5 是我在文本字段中输入的数据包数量。

  3. 我发起了攻击,所以在命令提示符下应该会发生以下情况: 5 packets sent to locahost

    语言是芬兰语,但还是一样。

    这是对我试图完成的事情的基本解释,希望有人理解并可以帮助/告诉我为什么我的代码不起作用,或者可以工作但没有在 eclipse 控制台中打印正确的行。

    <

最佳答案

您的 getOutput 方法有问题。看起来您打算收集每一行输出。但实际上,由于您将 line 分配给 output,因此您只会返回流结束前的最后一行。

要解决此问题,请更改

    output = line;

    output += line + "\n";

或者更准确地说:

    output += line + LINE_SEPARATOR;

您之前将后者声明为:

    final String LINE_SEPARATOR = System.getProperty("line.separator");

这并不能直接解释为什么您得到 null,但这可能是因为您正在运行的命令正在将输出写入“错误”流而不是“输出”流。

关于java - 如何使用java程序运行命令提示符命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15852144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com