最近许多客户反应终端启动后异常,我们想去批量测试终端问题,特此做呢个远程开关机的小工具;
设计逻辑是通过服务端发送cmd指令 ,客户端接受执行指令,并把结果返回给服务端,话不多说直接上代码:
1.客户端
package testsocket; import java.awt.dimension; import java.awt.rectangle; import java.awt.robot; import java.awt.toolkit; import java.awt.image.bufferedimage; import java.io.datainputstream; import java.io.dataoutputstream; import java.io.file; import java.io.fileinputstream; import java.io.filenotfoundexception; import java.io.ioexception; import java.net.socket; import java.net.unknownhostexception; import java.text.simpledateformat; import java.util.date; import java.util.scanner; import javax.imageio.imageio; import javax.swing.jframe; //客户端 public class kehu { private static string serviceip; private static integer serviceport; private static string imageformat = "jpg"; //图像文件的格式 private static dimension d = toolkit.getdefaulttoolkit().getscreensize(); private static simpledateformat sdfymdhm = new simpledateformat("yyyymmddhhmm"); private static socket socket; private static datainputstream in; private static dataoutputstream out; @suppresswarnings("static-access") public static void main(string[] args) throws unknownhostexception, ioexception, interruptedexception { jframe a = new jframe(); a.setdefaultcloseoperation(jframe.exit_on_close);//设置默认关闭,当关闭窗口时,程序即结束 a.setbounds(100, 100, 300, 200);//设置窗口坐标和大小 a.setlocationrelativeto(null);//窗口居中 a.setvisible(true); a.settitle("客户端"); a.setresizable(false); string curaddr = system.getproperty("user.dir"); //string configaddr = curaddr+"\\mainconfig.txt"; //exe执行时路径 string configaddr = curaddr+"\\src\\config\\mainconfig.txt"; //ide工具执行路径 string[] text=getfile(configaddr); for (string con : text) { if("serviceip".equals(con.substring(0, con.indexof("=")))){ serviceip = con.substring(con.indexof("=")+1, con.length()); }else if("serviceport".equals(con.substring(0, con.indexof("=")))){ serviceport = integer.parseint(con.substring(con.indexof("=")+1, con.length())); } } while(true){ socket = new socket(serviceip,serviceport); in = new datainputstream(socket.getinputstream()); out = new dataoutputstream(socket.getoutputstream()); string s = ""; try { s = in.readutf(); } catch (exception e) { while(true){ try { socket = new socket(serviceip,serviceport); in = new datainputstream(socket.getinputstream()); out = new dataoutputstream(socket.getoutputstream()); } catch (exception e2) { e.printstacktrace(); thread.currentthread().sleep(1000*60*5); } finally{ if(socket!=null){ break; } } } } snapshot(curaddr,out); out.close(); in.close(); socket.close(); callcmd(s); } } public static string[] getfile(string realpath) { scanner scanner = null; string[] text = new string[4]; int i = 0; try { file file= new file(realpath); scanner = new scanner(file); } catch (filenotfoundexception e) { e.printstacktrace(); } if(scanner!=null){ while(scanner.hasnextline()){ text[i]= scanner.nextline(); i++; } scanner.close(); } return text; } public static void snapshot(string addr,dataoutputstream outs) { try { //拷贝屏幕到一个bufferedimage对象screenshot bufferedimage screenshot = (new robot()).createscreencapture(new rectangle(0, 0,(int) d.getwidth(), (int) d.getheight())); //根据文件前缀变量和文件格式变量,自动生成文件名 string name = addr+"\\"+sdfymdhm.format(new date())+".jpg"; file f = new file(name); imageio.write(screenshot, imageformat, f); fileinputstream fin = new fileinputstream(f); byte[] sendbyte = new byte[1024]; outs.writeutf(f.getname()); int length = 0; while((length = fin.read(sendbyte, 0, sendbyte.length))>0){ outs.write(sendbyte,0,length); outs.flush(); } fin.close(); f.delete(); } catch (exception ex) { system.out.println(ex); } } //执行cmd命令 public static void callcmd(string cmd) throws ioexception{ runtime.getruntime().exec(cmd); } }
2.服务端
package testframe; import java.awt.color; import java.awt.font; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.windowadapter; import java.awt.event.windowevent; import java.io.bufferedreader; import java.io.datainputstream; import java.io.dataoutputstream; import java.io.file; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.filewriter; import java.io.ioexception; import java.io.inputstreamreader; import java.io.printwriter; import java.net.serversocket; import java.net.socket; import java.text.simpledateformat; import java.util.date; import java.util.hashmap; import java.util.map; import java.util.scanner; import java.util.timer; import javax.swing.borderfactory; import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.joptionpane; import javax.swing.jpanel; import javax.swing.jscrollpane; import javax.swing.jtextarea; //服务器 public class testmain extends jframe{ private static final long serialversionuid = 1l; private static string logaddr = ""; private static string logimageaddr = ""; private static simpledateformat sdfymd = new simpledateformat("yyyy-mm-dd"); private static simpledateformat sdfymdhm = new simpledateformat("yyyy-mm-dd hh:mm"); private static simpledateformat sdfymdhms = new simpledateformat("yyyy-mm-dd hh:mm:ss"); private static string curlogaddr = ""; final string loopback_address = "127.0.0.1"; private static dataoutputstream out; private static datainputstream in; private static socket cursocket; private static string serviceip; private static integer serviceport; private static map<string,socket> socketlist = new hashmap<string,socket>(); //客户端集合信息 private static fileoutputstream fout = null; private static byte[] inputbyte = null; private static timer timer; public static void main(string[] args) throws ioexception { date d = new date(); string logdatefile = sdfymd.format(d); string curaddr = system.getproperty("user.dir"); //string configaddr = curaddr+"\\mainconfig.txt"; //exe执行时路径 string configaddr = curaddr+"\\src\\config\\mainconfig.txt"; //ide工具执行路径 string[] text=getfile(configaddr); for (string con : text) { if("logaddr".equals(con.substring(0, con.indexof("=")))){ logaddr = con.substring(con.indexof("=")+1, con.length()); judedirexists(new file(con.substring(con.indexof("=")+1, con.length()))); }else if("logimageaddr".equals(con.substring(0, con.indexof("=")))){ logimageaddr = con.substring(con.indexof("=")+1, con.length()); judedirexists(new file(con.substring(con.indexof("=")+1, con.length()))); }else if("serviceip".equals(con.substring(0, con.indexof("=")))){ serviceip = con.substring(con.indexof("=")+1, con.length()); }else if("serviceport".equals(con.substring(0, con.indexof("=")))){ serviceport = integer.parseint(con.substring(con.indexof("=")+1, con.length())); } } curlogaddr = logaddr+"\\unittest_"+logdatefile+".log"; judefileexists(new file(curlogaddr)); filewriter fw = new filewriter(curlogaddr,true); printwriter pw = new printwriter(fw); if(!"".equals(logaddr)||!"".equals(logimageaddr)||!"".equals(serviceip)||!"".equals(serviceport)){ pw.write(sdfymdhms.format(new date())+": 启动成功!\r\n"); pw.flush(); fw.flush(); pw.close(); fw.close(); testmain myframe = new testmain(); myframe.setvisible(true); myframe.settitle("自动开关机工具"); myframe.setresizable(false); newservice(); }else{ pw.write(sdfymdhms.format(new date())+": 启动失败,mainconfig.txt配置文件异常!\r\n"); pw.flush(); fw.flush(); pw.close(); fw.close(); } } public testmain() throws ioexception{ setdefaultcloseoperation(jframe.exit_on_close);//设置默认关闭,当关闭窗口时,程序即结束 setbounds(100, 100, 600, 360);//设置窗口坐标和大小 setlocationrelativeto(null);//窗口居中 font fontstyle = new font(font.dialog,font.bold, 18); font fontconton = new font(font.dialog,font.layout_no_limit_context, 18); jpanel panel = new jpanel(); jlabel label = new jlabel("ip地址:"); label.setfont(fontstyle); panel.add(label); final jtextarea iparea = new jtextarea(10, 35); iparea.setlinewrap(true); iparea.setfont(fontconton); jscrollpane ippane =new jscrollpane(iparea); ippane.setverticalscrollbarpolicy(jscrollpane.vertical_scrollbar_as_needed); panel.add(ippane); jlabel labela = new jlabel("重启效率:"); labela.setfont(fontstyle); panel.add(labela); final jtextarea datearea = new jtextarea(1, 3); datearea.setlinewrap(false); datearea.setborder(borderfactory.createlineborder(color.black,1)); datearea.setfont(fontconton); panel.add(datearea); jlabel labeb = new jlabel("(分钟/每次) "); labeb.setfont(fontstyle); panel.add(labeb); final jlabel labec = new jlabel(""); jbutton btn = new jbutton("发送"); btn.setfont(fontstyle); btn.addactionlistener(new actionlistener() { @override public void actionperformed(actionevent e) { if(datearea.gettext().isempty()||iparea.gettext().isempty()){ joptionpane.showmessagedialog(null, "请输入ip地址和重启效率"); }else{ try { timerfunction(datearea.gettext(),iparea.gettext(),labec); } catch (ioexception e1) { e1.printstacktrace(); } } } }); panel.add(btn); labec.setfont(fontstyle); labec.setforeground(color.red); panel.add(labec); this.setcontentpane(panel); this.addwindowlistener(new windowadapter() { @override public void windowclosing(windowevent e){ filewriter fw = null; try { fw = new filewriter(curlogaddr,true); } catch (ioexception e1) { e1.printstacktrace(); } printwriter pw = new printwriter(fw); pw.write(sdfymdhms.format(new date())+": 关闭成功!\r\n"); try { pw.flush(); fw.flush(); pw.close(); fw.close(); } catch (ioexception e1) { e1.printstacktrace(); } system.exit(0); } }); } public static void timerfunction(final string timesize,final string iptext,final jlabel labec) throws ioexception{ final int timecount = integer.parseint(timesize); if(timer!=null){ timer.cancel(); } timer = new timer(); timer.schedule( new java.util.timertask() { public void run() { timefunctioncontion(iptext,labec); } }, 0, timecount*60*1000); } public static string[] getfile(string realpath) { scanner scanner = null; string[] text = new string[4]; int i = 0; try { file file= new file(realpath); scanner = new scanner(file); } catch (filenotfoundexception e) { e.printstacktrace(); } if(scanner!=null){ while(scanner.hasnextline()){ text[i]= scanner.nextline(); i++; } scanner.close(); } return text; } //校验ip public static boolean ipcheck(string text) { if (text != null && !text.isempty()) { // 定义正则表达式 string regex = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\." +"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." +"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." +"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$"; // 判断ip地址是否与正则表达式匹配 if (text.matches(regex)) { return true; } else { return false; } } return false; } //判断文件夹是否存在 public static void judedirexists(file file) { if (!file.exists()) { file.mkdir(); } } //判断文件是否存在 public static void judefileexists(file file) { if (!file.exists()) { try { file.createnewfile(); } catch (exception e) { e.printstacktrace(); } } } //通过ip地址获取mac地址 public static string getmacaddress(string ip) throws exception { string macaddress = ""; try { string cmd = "ping " + ip; string ret = callcmd(cmd); if(ret!=null &&!"".equals(ret)){//判断ip地址是否存在 cmd = "nbtstat -a " + ip; macaddress = callcmdmac(cmd); } } catch (ioexception e) { e.printstacktrace(); } return macaddress; } //获取mac地址 public static string callcmdmac(string cmd) throws ioexception{ process p = runtime.getruntime().exec(cmd); inputstreamreader isr = new inputstreamreader(p.getinputstream(),"gb2312"); bufferedreader br = new bufferedreader(isr); string line=""; int startindex = 0; while ((line = br.readline()) != null) { startindex = line.indexof("mac 地址"); if(startindex>0){ line = line.substring(startindex+8, line.length()).trim().touppercase(); break; } } br.close(); return line; } //创建服务器端 public static string callcmd(string cmd) throws ioexception{ process p = runtime.getruntime().exec(cmd); inputstreamreader isr = new inputstreamreader(p.getinputstream()); bufferedreader br = new bufferedreader(isr); string line=""; string ret=""; while ((line = br.readline()) != null) { if (line != null) { ret =line; } } br.close(); return ret; } //创建服务器端 public static void newservice() throws ioexception{ serversocket serversocket=new serversocket(serviceport); while(true){ socket sk = serversocket.accept(); //当有客户端连接时,产生阻塞 socketlist.put(sk.getinetaddress().tostring(), sk); filewriter fw = new filewriter(curlogaddr,true); printwriter pw = new printwriter(fw); pw.write(sdfymdhms.format(new date())+": 新的客户端连接!"+sk.getinetaddress()+":"+sk.getport()+"\r\n"); system.out.println("新的客户端连接"+sk.getinetaddress()+":"+sk.getport()); pw.flush(); fw.flush(); pw.close(); fw.close(); } } public static void timefunctioncontion(string iptext,jlabel labec){ filewriter fw = null; try { fw = new filewriter(curlogaddr,true); } catch (ioexception e) { e.printstacktrace(); } printwriter pw = new printwriter(fw); date d = new date(); string datenowstr = sdfymdhm.format(d); labec.settext("发送成功,上次发送时间"+datenowstr); string[] iplist = iptext.split(","); for (string ip : iplist) { if(ipcheck(ip)){ try { cursocket = socketlist.get("/"+ip); out=new dataoutputstream(cursocket.getoutputstream()); //信息接发流 out.writeutf("shutdown -r -t 20"); in = new datainputstream(cursocket.getinputstream()); string curipimgaddfol = logimageaddr+"\\"+ip; judedirexists(new file(curipimgaddfol)); fout = new fileoutputstream(new file(curipimgaddfol+"\\"+in.readutf())); inputbyte = new byte[1024]; int length = 0; while (true) { if (in != null) { length = in.read(inputbyte, 0, inputbyte.length); } if (length == -1) { break; } fout.write(inputbyte, 0, length); fout.flush(); } pw.write(sdfymdhms.format(new date())+": "+ip+"重启成功\r\n"); fout.close(); } catch (exception e) { e.printstacktrace(); } }else{ pw.write(sdfymdhms.format(new date())+": "+ip+" 地址不合法!\r\n"); } } try { fw.flush(); pw.close(); fw.close(); pw.flush(); } catch (ioexception e) { e.printstacktrace(); } } }
如有问题联系我qq:316349645
如对本文有疑问, 点击进行留言回复!!
Android 4.0使用Kotlin调用C语言以及汇编语言
Java Class.forName()用法和newInstance()方法原理解析
网友评论