zoukankan      html  css  js  c++  java
  • java远程开关机

    最近,很多客户向我们反馈终端启动后异常的问题,因此,我自己做了一个远程开关的小工具,该工具的目的在于通过批量的方式来控制终端启动。其设计逻辑是通过服务端发送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())+":  启动成功!
    ");
                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配置文件异常!
    ");
                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())+":  关闭成功!
    ");
                      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()+"
    ");
                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+"重启成功
    ");
                             fout.close();
                        } catch (Exception e) {                            
                            e.printStackTrace();                        
                        }
                   }else{
                       pw.write(sdfymdhms.format(new Date())+":  "+ip+" 地址不合法!
    ");                         
                   }
               }
               try {
                   fw.flush();
                   pw.close();
                   fw.close();
                   pw.flush();
               } catch (IOException e) {                
                   e.printStackTrace();
               }
        }
    }

    如有问题联系我QQ:316349645

  • 相关阅读:
    windows10安装vmware14教程
    MySQL变量的使用
    软考和软件设计师
    Java web加密之将应用从http换成https的方法
    cmd命令net和sc
    cmd命令 taskkill
    CSS系列:CSS的继承与层叠特性
    CSS系列:CSS选择器
    CSS系列:在HTML中引入CSS的方法
    Sql Server系列:索引维护
  • 原文地址:https://www.cnblogs.com/yanjie-Bill/p/10150862.html
Copyright © 2011-2022 走看看