当前位置: 移动技术网 > IT编程>开发语言>Java > java远程开关机

java远程开关机

2018年12月20日  | 移动技术网IT编程  | 我要评论

最近许多客户反应终端启动后异常,我们想去批量测试终端问题,特此做呢个远程开关机的小工具;

设计逻辑是通过服务端发送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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网