java - all my methods on button click wait for the thread to complete before actioning -
i new java , trying build port scanner university course. have got majority of work although having problem ui. have set button text change "start scan" "stop scan" depending on set of variables. when "start scan" button pressed starts thread hosts scanner, however, button text not change, "stop scan" until after thread has finished. lost on how fix this. appreciated.
this swing class
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; /** * code edited or generated using cloudgarden's jigloo * swt/swing gui builder, free non-commercial * use. if jigloo being used commercially (ie, corporation, * company or business purpose whatever) * should purchase license each developer using jigloo. * please visit www.cloudgarden.com details. * use of jigloo implies acceptance of these licensing terms. * commercial license has not been purchased * machine, jigloo or code cannot used * legally 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 display 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 ip address or domain name of 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 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 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 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"); } } }
and scanner code.
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){ (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; } }
sorry if overly excessive amount of code share, not sure parts relevant have shared all.
any other improvements see gratefully received. thank in advance help.
kindest regards
james
you should invoke ps.start()
make ps run separate thread;
looks have invoked ps.run()
, not start separate thread, runs code in sequential manner
Comments
Post a Comment