gpt4 book ai didi

java - 我已经使用 java 创建了一个 portscanner,但是当我单击“执行”时,它就卡住了

转载 作者:行者123 更新时间:2023-12-01 17:30:14 26 4
gpt4 key购买 nike

下面的代码是我用来创建端口扫描器的代码,但是,当我单击“扫描”时,它会执行,但图形用户界面会卡住,直到完成扫描,是否有任何可能的方法允许它在执行其他操作的同时扫描?

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class PortScannerGUI extends JFrame implements ActionListener
{
JPanel Panel = new JPanel(null);
JTextField Field = new JTextField();
JButton Button = new JButton();
JTextArea Area = new JTextArea();
JButton limit = new JButton("limit");

public PortScannerGUI()
{
super();
setSize(350, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
setLocationRelativeTo(null);
LoadUI();
}

public void LoadUI()
{
Area.setBounds(20, 50, 310, 310);
Area.setBorder(BorderFactory.createLineBorder(Color.BLUE));
Area.setEditable(false);

Field.setBounds(20, 10, 200, 35);

Button.setBounds(230, 10,100, 35);
Button.setText("Scan");
Button.addActionListener(this);

Panel.add(Field);
Panel.add(Area);
Panel.add(Button);
add(Panel);
setVisible(true);
}

public static void main(String[] args)
{
PortScannerGUI Main = new PortScannerGUI();
}

@Override
public void actionPerformed(ActionEvent arg0)
{
Thread Runner = new Thread();
Runner.start();
int j=0;
String str = Field.getText();
for(int i=1;i<str.length();i++)
{
if(str.substring(i-1, i).equals("."))
{
j++;
}
}
if(!str.equals("") || j==4 || j==6)
{
try
{
InetAddress IP = InetAddress.getByName(str);
PortScanner P = new PortScanner(IP);
}
catch (Exception e){}
}
else
{
JOptionPane.showMessageDialog(null, "Not an IP address");
}

}
}

上面的代码是 GUI 部分的代码,下面是实际扫描端口的代码。

import java.io.IOException;

import java.net.InetAddress;

import java.net.Socket;

public class PortScanner
{
public PortScanner(InetAddress iA)
{
for (int port = 1; port <= 65535; port++)
{
try
{
Socket s = new Socket(iA, port);
System.out.println("Port " + port + " is open");
s.close();
}
catch(IOException e)
{

}
}
}
}

最佳答案

这是在 Swing 事件线程(EDT 或事件调度线程)中执行长时间运行的进程的典型示例,从而卡住该线程,从而使 GUI 无法运行。我们一次又一次地看到此类事情,解决方案是相同的并且相对简单:在后台线程中执行长时间运行的进程,例如 SwingWorker 可以提供的线程。有关这方面的更多信息,请阅读 Concurrency in Swing ,或者在这个网站上搜索类似的问题,因为同样,这个问题讨论得很多。

关于您的代码的另一点,永远不要这样做:

    catch(IOException e)
{

}

如果您忽略异常,那么您实际上是盲目的。至少,打印堆栈跟踪,即:

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

这里也一样:

     try {
InetAddress IP = InetAddress.getByName(str);
PortScanner P = new PortScanner(IP);
} catch (Exception e) {
e.printStackTrace(); // **** add this!
}

我自己,我会在 PortScanner 构造函数中设置 PortScanner 对象,但会在单独的公共(public)方法中运行扫描,例如 scan()。这将允许我在事件线程上设置 PortScanner 对象,然后通过调用其 scan() 方法在后台线程中扫描它。有时这更方便。

编辑
我还赋予 PortScanner 类添加 PropertyChangeListener 的能力,以便其他类可以监听它的更改,包括有关端口的信息。这样您就可以在 GUI 中发布 PortScanner 端口信息。最简单的方法是让 PortScanner 对象扩展 SwingWorker,因为 SwingWorkers 内置了 PropertyChangeSupport。然后,您可以使用发布/处理方法对将端口信息发布到 GUI,而不是在 println 语句中将其打印出来。我上面链接的教程描述了如何执行此操作,如果您遇到困难,我们可以帮助您解决详细信息。

关于java - 我已经使用 java 创建了一个 portscanner,但是当我单击“执行”时,它就卡住了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11809443/

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