java - creating a command based logger program -
i'm trying make java program creates , writes log file.
it has 2 classes (one request, 1 worker code). 1 class has textfield , allows enter command. command should 'log start' or 'log stop'.
so request class sends command string, worker class gets command, parses , executes instructions (start logging, stop logging.
my problem is: application doesn't stop logging when user enters 'stop' command. well, doesn't stop after 3 log entries (that's problem. want stop time user enters command) understand problem better when take @ code.
i know i'm making basic mistake here somehow can't figure out , want opinion on problem. (i showed problematic in code) thank you.
error:
exception in thread "stoplogging" java.lang.arrayindexoutofboundsexception: 1 @ response$clientprocess$1stopperthread.run(response.java:109) @ java.lang.thread.run(unknown source)
request class:
public class request extends jframe { private jtextarea consolearea = new jtextarea(); private jtextfield cmd_prompt = new jtextfield(); private jlabel cmd_label = new jlabel("enter command: "); // ********ip port textfields & connect button******* !!!! private dataoutputstream output; private datainputstream input; public static void main(string[] args) { new request(); } socket socket = null; string command; public request (){ jpanel requestpanel = new jpanel(); requestpanel.setlayout(new borderlayout()); settitle("project_3002_client"); requestpanel.add(cmd_label, borderlayout.west); requestpanel.add(cmd_prompt, borderlayout.center); setlayout(new borderlayout()); add(requestpanel, borderlayout.north); add(new jscrollpane(consolearea), borderlayout.center); font font = new font("courier new", font.bold, 15); cmd_prompt.setfont(font); cmd_prompt.setalignmentx(left_alignment); cmd_prompt.addactionlistener(new textfieldlistener()); setsize(600, 270); setdefaultcloseoperation(jframe.exit_on_close); consolearea.setfont(font); setvisible(true); string ip = "127.0.0.1"; // changed (make custom) --extra jframe int port = 4588; // changed (make custom) -- jframe try { socket = new socket(ip, port); //io connection stuff input = new datainputstream(socket.getinputstream()); output = new dataoutputstream(socket.getoutputstream()); } catch (ioexception ex) { consolearea.append("connection refused. please check if server running.\n"); } } class senderthirty implements runnable{ thread send30secs; public senderthirty(){ } public senderthirty(string send30s){ send30secs = new thread(this, send30s); send30secs.start(); } @override public void run() { try { output.writeutf(command); } catch (ioexception e) { e.printstacktrace(); } } } private class textfieldlistener implements actionlistener{ public void actionperformed(actionevent e) { try { command = cmd_prompt.gettext(); if (command.contains("start") == true){ thread sendstart = new thread(new senderthirty(), "send"); sendstart.start(); //continue } else if (command.contains("stop") == true){ thread sendstop = new thread(new senderthirty(), "send"); sendstop.start(); //continue } else {consolearea.append("\ninvalid command\n");} } catch (exception e1) { consolearea.append("\nerr!\n"); } } }}
worker class:
public class response { string path = ""; public static void main(string[] args) throws interruptedexception { new response(); } serversocket resp_sock; public response() throws interruptedexception { int port = 4588; try { resp_sock = new serversocket(port); int clientno = 1; while (true) { socket socket = resp_sock.accept(); // client's ip address inetaddress client_addr = socket.getinetaddress(); clientprocess task = new clientprocess(socket); new thread(task).start(); clientno++; } } catch (ioexception ex) { joptionpane.showmessagedialog(null, ex); } } class clientprocess implements runnable { private socket socket; public clientprocess(socket socket) { this.socket = socket; } @override public void run() { try { final datainputstream input = new datainputstream(socket.getinputstream());//from client //dataoutputstream output = new dataoutputstream(socket.getoutputstream());//to client while(true){ string prompt = input.readutf(); string command[] = prompt.split(" "); final logger logger = logger.getlogger("mylog"); filehandler fh; fh = new filehandler("c:\\..path..\\logfile.log"); logger.addhandler(fh); simpleformatter formatter = new simpleformatter(); fh.setformatter(formatter); class stopperthread implements runnable{ public stopperthread(){ } @override public void run() { try { ////////////////////////////////////////***problem in try block*** string next_prompt; next_prompt = input.readutf(); string nextcommand[] = next_prompt.split(" "); if(nextcommand[1].equalsignorecase("stop")){ logger.info("stopped " + new date() + " \n"); system.exit(0);} } catch (ioexception e) { e.printstacktrace(); } }} if(command[1].equalsignorecase("start")){ try { while(true){ logger.info("running " + new date() + " \n"); thread.sleep(5000); thread stoplogging = new thread(new stopperthread(), "stoplogging"); stoplogging.start(); } } catch (securityexception e) { e.printstacktrace(); } catch (interruptedexception e) { e.printstacktrace(); } } if(command[1].equalsignorecase("stop")){ logger.info("stopped " + new date() + " \n"); } } } catch (ioexception ex) { joptionpane.showmessagedialog(null, ex); } } }}
if(nextcommand[1].equals...)
culprit.
it throw npe if there no space (" ") in string split, in case nextcommand's length 1, not 2.
you should check length beforehand. note: same potential error command[1]
.
Comments
Post a Comment