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

java远程开关机的更多相关文章

  1. 远程开关机神器Wake On LAN,免费有中文版

    https://wol.aquilatech.com/ Wake On Lan 又名 aquilaWOL,这是一款免费且开源的图形界面 WOL 软件,有繁体中文界面,可以管理多台电脑和网络设备,支持批 ...

  2. 简述HP iLO中的几种开关机选项

    ILO是intergrated Light-Out的缩写,是HP的远程管理功能,它可以实现远程开关机.远程安装.远程连接等功能. 笔者刚接触HP服务器时对四个关于开关机的选项非常困惑,不明其中区别.此 ...

  3. 用命令实现Win7远程桌面关机和重启

    关机 shutdown -s -t 0 重启 shutdown -r -t 0 打开运行框(Win+R键),输入上述命令即可,后面的数字表示关机/重启延迟的时间 at 12:00 shutdown - ...

  4. win7不正常开关机,系统恢复选项

    会win7不正常开关机后,会默认进入“系统回复选项”. 无人值守的机器远程会无法连接,默认会进入此界面. 解决方法: 到现场,鼠标.键盘.显示器, 开机后选择正常启动, 在命令行模式输入以下命令bcd ...

  5. 【Java远程debug】

    转自 http://blog.csdn.net/hongchangfirst/article/details/44191925 一.远程debug原理 Java远程调试的原理是两个JVM之间通过deb ...

  6. Azure Automation (3) 定期将某个Azure订阅下的所有虚拟机开关机

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China. 在笔者之前的文章中,我们介绍了使用Azure Automation ...

  7. Azure Automation (4) 按照Azure虚拟机的机器名,设置开关机

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China服务. 在有的时候,我们不需要将所有的虚拟机进行开关机. 本文介绍的脚 ...

  8. windows开关机时间记录

    1. 开机时间记录批处理文件,kai.bat @echo off echo %date% %time% 开机 >>D:\开关机记录\开关机时间.txt 2. 关机时间记录批处理文件,gua ...

  9. java模拟开锁

    java模拟开锁 service qq:928900200 Introduction to Computer Science II: CSCI142Fall 2014Lab #1Instructor: ...

随机推荐

  1. Scala基础:面向对象之trait

    trait类似于java中的interface,但是有所不同 Scala中的trait是一种特殊的概念: 首先先将trait作为接口使用,此时的trait就与Java中的接口 (interface)非 ...

  2. Python基础:Python数据类型及逻辑判断语句

    Python代码需要严谨的缩进 # 导包 import random # ********************输入输出***************** # 输出 print("hell ...

  3. Spark角色介绍及spark-shell的基本使用

    Spark角色介绍 1.Driver 它会运行客户端的main方法,构建了SparkContext对象,它是所有spark程序的入口 2.Application 它就是一个应用程序,包括了Driver ...

  4. Quartz_2_简单编程式任务调度使用(CronTrigger)

    第二个要介绍的任务调度器中的触发器是 CronTrigger ,相比较 SimpleTrigger 来说,CronTrigger 相对灵活,对于复杂的业务需求来说,更加的实用.要在使用 CronTri ...

  5. 【BZOJ2038】小Z的袜子【莫队】

    题意 给出包含n个数字的序列,和m个查询.每次查询问区间[l,r]中挑选出两个数字,大小相同的概率为多少. 分析 莫队的入门题吧.代码是非常好写,关键是时间复杂度的证明.O(n*sqrt(n)).我还 ...

  6. 670. Maximum Swap 允许交换一个数 求最大值

    [抄题]: Given a non-negative integer, you could swap two digits at most once to get the maximum valued ...

  7. web.xml配置详解[转]

    引文: 对于一个J2EE领域的程序员而言,基本上每天都会和web应用打交道. 什么是web应用?最简单的web应用什么样?给你一个web应用你该从何入手? 1.什么是web应用? web应用是一种可以 ...

  8. BOOST_TYPEOF和BOOST_AUTO

    1.简介 头文件<boost/typeof.hpp>里定义了两个宏:BOOST_TYPEOF和BOOST_AUTO,分别用于仿真C++新标准的typeof和auto关键字,可以在编译期自动 ...

  9. Django中的元类-乾颐堂

    看Django(1.6)的Form相关源代码时比较迷惑,于是节选了django.forms.forms.py中的几个代码片段来分析Django中是怎么使用元类的: 1 2 3 4 5 6 7 8 9 ...

  10. [Training Video - 4] [Groovy] Object equality and variable equality check

    def x=2 def y=3 if(x == y){ log.info "equal" }else{ log.info "not equal" // prin ...