最近,很多客户向我们反馈终端启动后异常的问题,因此,我自己做了一个远程开关的小工具,该工具的目的在于通过批量的方式来控制终端启动。其设计逻辑是通过服务端发送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