我是Java的新手,我正在尝试为我的大学课程构建一个端口扫描程序。尽管我遇到了UI问题,但我已经将其中的大部分工作了。我已将按钮文本设置为根据一组变量从“开始扫描”更改为“停止扫描”。按下“开始扫描”按钮时,它会启动承载扫描仪的线程,但按钮文本不会更改,直到线程完成后才会“停止扫描”。我迷失了如何解决这个问题。非常感谢任何帮助。
这是我的Swing课程
package com.ui;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.NumberFormat;
import javax.annotation.PostConstruct;
import javax.swing.*;
import javax.xml.bind.ParseConversionEvent;
import com.scanner.PortScanner;
/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class MainApp extends javax.swing.JFrame {
private JTextField txtTargetIP;
private JLabel lblEndPort;
private JLabel lblScanning;
private JList lstMessages;
private JButton btnScan;
private JLabel lblPortNumber;
private JList listListening;
private JCheckBox chkFullRange;
private JTextField txtFinalPort;
private JTextField txtStartPort;
private JLabel lblStartPort;
private JLabel lblTarget;
private DefaultListModel lstMessagesModel;
private DefaultListModel listListeningModel;
private PortScanner ps;
/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
MainApp inst = new MainApp();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}
});
}
public MainApp() {
super();
initGUI();
}
private void initGUI() {
try {
{
getContentPane().setLayout(null);
this.setTitle("Port Scanner");
{
txtTargetIP = new JTextField();
getContentPane().add(txtTargetIP);
txtTargetIP.setText("Enter Target IP Here");
txtTargetIP.setBounds(167, 39, 234, 22);
//txtTargetIP.setToolTipText("Enter the ip address or Domain name of the target Computer");
txtTargetIP.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent evt) {
txtTargetIPMousePressed(evt);
}
});
}
{
lblTarget = new JLabel();
getContentPane().add(lblTarget);
lblTarget.setText("Target Domain");
lblTarget.setBounds(50, 42, 111, 15);
}
{
lblStartPort = new JLabel();
getContentPane().add(lblStartPort);
lblStartPort.setText("Start Port");
lblStartPort.setBounds(50, 87, 71, 22);
}
{
txtStartPort = new JTextField();
getContentPane().add(txtStartPort);
txtStartPort.setText("Start Port");
txtStartPort.setBounds(121, 87, 82, 22);
txtStartPort.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent evt) {
txtStartPortMousePressed(evt);
}
});
}
{
lblEndPort = new JLabel();
getContentPane().add(lblEndPort);
lblEndPort.setText("Final Port");
lblEndPort.setBounds(246, 87, 73, 22);
}
{
txtFinalPort = new JFormattedTextField(NumberFormat.INTEGER_FIELD);
getContentPane().add(txtFinalPort);
txtFinalPort.setText("Final Port");
txtFinalPort.setBounds(319, 87, 82, 22);
txtFinalPort.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent evt) {
txtFinalPortMousePressed(evt);
}
});
}
{
chkFullRange = new JCheckBox();
getContentPane().add(chkFullRange);
chkFullRange.setText("Check All Ports");
chkFullRange.setBounds(50, 119, 133, 19);
chkFullRange.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent evt) {
chkFullRangeItemStateChanged(evt);
}
});
}
{
listListeningModel = new DefaultListModel();
listListening = new JList();
getContentPane().add(listListening);
listListening.setModel(listListeningModel);
listListening.setBounds(248, 204, 153, 133);
listListening.setBorder(BorderFactory.createTitledBorder("Listening Ports"));
listListening.setEnabled(false);
}
{
lblScanning = new JLabel();
getContentPane().add(lblScanning);
lblScanning.setText("Currently Scanning Port: ");
lblScanning.setBounds(50, 349, 171, 16);
}
{
lblPortNumber = new JLabel();
getContentPane().add(lblPortNumber);
lblPortNumber.setText("Port Number");
Font f1 = new Font("italic", Font.ITALIC, 12);
lblPortNumber.setFont(f1);
lblPortNumber.setBounds(234, 349, 94, 16);
}
{
btnScan = new JButton();
getContentPane().add(btnScan);
btnScan.setText("Start Scan");
btnScan.setBounds(50, 150, 351, 42);
btnScan.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent evt) {
btnScanMousePressed(evt);
}
});
}
{
lstMessagesModel = new DefaultListModel();
lstMessages = new JList();
getContentPane().add(lstMessages);
lstMessages.setModel(lstMessagesModel);
lstMessages.setBounds(50, 204, 153, 133);
lstMessages.setBorder(BorderFactory.createTitledBorder("Messages"));
lstMessages.setEnabled(false);
}
}
this.setSize(448, 411);
} catch (Exception e) {
e.printStackTrace();
}
}
private void txtTargetIPMousePressed(MouseEvent evt) {
if (txtTargetIP.getText().equals("Enter Target IP Here") || txtTargetIP.getText().equals("------")){
txtTargetIP.setText("");
}
if (txtStartPort.getText().equals("")){
txtStartPort.setText("Start Port");
}
if(txtFinalPort.getText().equals("")){
txtFinalPort.setText("Final Port");
}
}
private void txtStartPortMousePressed(MouseEvent evt) {
if((txtStartPort.getText().equals("Start Port") || txtStartPort.getText().equals("------")) && chkFullRange.isSelected()==false){
txtStartPort.setText("");
}
if(txtTargetIP.getText().equals("")){
txtTargetIP.setText("Enter Target IP Here");
}
if(txtFinalPort.getText().equals("") && chkFullRange.isSelected()==false){
txtFinalPort.setText("Final Port");
}
}
private void txtFinalPortMousePressed(MouseEvent evt) {
if((txtFinalPort.getText().equals("Final Port") || txtFinalPort.getText().equals("------")) && chkFullRange.isSelected()==false){
txtFinalPort.setText("");
}
if(txtTargetIP.getText().equals("")){
txtTargetIP.setText("Enter Target IP Here");
}
if(txtStartPort.getText().equals("") && chkFullRange.isSelected()==false){
txtStartPort.setText("Start Port");
}
}
//Check All Ports
private void chkFullRangeItemStateChanged(ItemEvent evt) {
if(chkFullRange.isSelected()==true){
txtStartPort.setEnabled(false);
txtStartPort.setText("0");
lblStartPort.setForeground(Color.GRAY);
txtFinalPort.setEnabled(false);
txtFinalPort.setText("65535");
lblEndPort.setForeground(Color.GRAY);
;
}
if (chkFullRange.isSelected()==false){
txtStartPort.setEnabled(true);
txtStartPort.setText("Start Port");
lblStartPort.setForeground(Color.BLACK);
txtFinalPort.setEnabled(true);
txtFinalPort.setText("Final Port");
lblEndPort.setForeground(Color.BLACK);
}
if(txtTargetIP.getText().equals("")){
txtTargetIP.setText("Enter Target IP Here");
}
}
//Start Scan
private void btnScanMousePressed(MouseEvent evt) {
lstMessagesModel.clear();
refresh();
if (btnScan.getText().equals("Start Scan") && errorCheck()==0){
listListeningModel.clear();
btnScan.setText("Stop Scan");
lstMessagesModel.addElement("Scan Started...");
int p1 = Integer.parseInt(txtStartPort.getText());
int p2 = Integer.parseInt(txtFinalPort.getText());
String target = txtTargetIP.getText();
ps = new PortScanner(p1, p2, target);
ps.run();
listListeningModel.addElement(ps.getListening());
}
else if (btnScan.getText().equals("Stop Scan") || ps.isAlive()==false){
ps.stopScan();
btnScan.setText("Start Scan");
lstMessagesModel.addElement("Scan Stopped");
}
}
//Check input for errors
public int errorCheck(){
System.out.println("Running errorCheck");
int errors=0;
if (txtTargetIP.getText().equals(null) || txtTargetIP.getText().equals("Enter Target IP Here") || txtTargetIP.getText().equals("------")){
txtTargetIP.setBackground(Color.RED);
txtTargetIP.setText("------");
lstMessagesModel.addElement("No target Specified");
errors++;
}else{
txtTargetIP.setBackground(Color.WHITE);
}
if(chkFullRange.isSelected()==false && (txtStartPort.getText().equals(null) || txtStartPort.getText().equals("Start Port") || txtStartPort.getText().equals("------"))){
txtStartPort.setBackground(Color.RED);
txtStartPort.setText("------");
lstMessagesModel.addElement("No Start Port Specified");
errors++;
}else{
txtStartPort.setBackground(Color.WHITE);
}
if(chkFullRange.isSelected()==false && (txtFinalPort.getText().equals(null) || txtFinalPort.getText().equals("Final Port") || txtFinalPort.getText().equals("------"))){
txtFinalPort.setBackground(Color.RED);
txtFinalPort.setText("------");
lstMessagesModel.addElement("No Final Port Specified");
errors++;
}else{
txtFinalPort.setBackground(Color.WHITE);
}
System.out.println(errors);
return errors;
}
//Refresh Input Areas
public void refresh(){
if (txtTargetIP.getText().equals("") || txtTargetIP.getText().equals("------")){
txtTargetIP.setText("Enter Target IP Here");
}
if (txtStartPort.getText().equals("") || txtStartPort.getText().equals("------")){
txtStartPort.setText("Start Port");
}
if (txtFinalPort.getText().equals("") || txtFinalPort.getText().equals("------")){
txtFinalPort.setText("Final Port");
}
}
}
这是我的扫描程序代码。
package com.scanner;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadFactory;
public class PortScanner extends Thread implements Runnable{
private boolean running = true;
//private int currentPort;
private List<Integer> listening = new ArrayList<Integer>();
private int startPort;
private int finalPort;
private String targetDomain;
public PortScanner() {
// TODO Auto-generated constructor stub
}
public PortScanner(int startPort, int finalPort, String targetDomain) {
super();
this.startPort = startPort;
this.finalPort = finalPort;
this.targetDomain = targetDomain;
}
@Override
public void run() {
while(running==true){
for (int currentPort = startPort; currentPort <= finalPort; currentPort++) {
System.out.println(currentPort + ":" + finalPort);
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(targetDomain, currentPort),200);
listening.add(currentPort);
System.out.println("listening: " + listening);
socket.close();
} catch (IOException e) {
System.out.println("scanning: " + currentPort);
}
if(currentPort!=finalPort+1){
running=false;
}
}
}
}
//stop Thread
public void stopScan(){
running=false;
}
/*public int getCurrentPort() {
return currentPort;
}
public void setCurrentPort(int currentPort) {
this.currentPort = currentPort;
}*/
public List<Integer> getListening() {
return listening;
}
public void setListening(List<Integer> listening) {
this.listening = listening;
}
public int getStartPort() {
return startPort;
}
public void setStartPort(int startPort) {
this.startPort = startPort;
}
public int getFinalPort() {
return finalPort;
}
public void setFinalPort(int finalPort) {
this.finalPort = finalPort;
}
public String getTargetDomain() {
return targetDomain;
}
public void setTargetDomain(String targetDomain) {
this.targetDomain = targetDomain;
}
}
很抱歉,如果分享的代码数量过多,但我不确定哪些部分与您相关,所以我已经分享了所有这些内容。
您也会感激地看到您所看到的任何其他改进。预先感谢您的帮助。
最基本的问候
詹姆斯
答案 0 :(得分:2)
你应该调用ps.start()
使ps作为一个单独的线程运行;
看起来你已经调用了ps.run()
,它没有启动一个单独的线程,而是以顺序方式运行代码
答案 1 :(得分:2)
您需要在单独的线程中执行长时间运行的任务。有关详细信息,请阅读Concurrency上的Swing教程。当您想要更新标签或任何其他GUI组件时,可以使用Swing Worker
作为线程并将结果发布到GUI。