因为经常开着笔记本工作,累了就坐床上玩手机,但晚上要睡觉了又不想下床去关电脑,就想做个Android软件来控制PC端的关机和重启。要想实现此功能,就得让Android手机和PC之间进行通信才能,因此采用Socket编程来实现。
==================================Shutdown命令的用法========================================
首先得了解一下关于Shutdown命令的用法。
选择win+R,打开命令行窗口,输入shutdown /? 按Enter回车键,
即可以查看一些shutdown的用法:
shutdown -l 注销。这不能与 /m 或 /d 选项一起使用。
shutdown -s 关闭计算机。
shutdown -r 完全关闭并重新启动计算机。
shutdown -a 中止系统关闭。
shutdown -p 关闭本地计算机,没有超时或警告。
shutdown -h 休眠本地计算机。
shutdown -t xxx 将关闭前的超时时间设置为 xxx 秒。
shutdown -c "comment" 有关重新启动或关闭的原因的注释。
shutdown -f 强制关闭正在运行的应用程序而不事先警告用户。
shutdown -d [p|u:]xx:yy 提供重新启动或关闭的原因。
下面介绍一些shutdown的一个最常用的功能,即定时关机、重启和取消关机。
定时关机,即shutdown -s -t "这里填时间" 如:shutdown -s -t 60
这里时间是按秒来算的,即是一分钟之后关机。
定时关机并重启,即shutdown -r -t "这里填时间" 如:shutdown -r -t 60
这里时间是按秒来算的,即是一分钟之后关机r然后重启。
我们可以使用shutdown -a来取消定时关机的任务,不过要在关机的前一秒
================================PC服务器端的实现===========================================
PC端的服务器代码很简单,就是监听端口30000,然后获取Android发过来的指令,使用Runtime.getRuntime().exec(String command)方法来执行上面介绍的Shutdown命令,来实现控制PC端的关机、重启或者取消关机的功能。
端口号必须是空闲的才行,端口号的范围从0到65535,像网络端口80,FTP端口21,mysql默认端口3306,我用的30000端口,一般不会被占用。
代码如下:
package com.oyp.shutdown; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class ShutDownServer { static ServerSocket serverSocket = null;// 服务socket static DataInputStream dataInput = null;// 输入流 static DataOutputStream dataOutput = null;// 输出流 public static void main(String[] args) { try { // 监听30000端口 serverSocket = new ServerSocket(30000); System.out.println("ShutDownServer is listening port 30000............"); while (true) { // 获取客户端套接字 Socket clientSocket = serverSocket.accept(); String send_msg = ""; try { // 获取输入流,读取客户端传来的数据 dataInput = new DataInputStream( clientSocket.getInputStream()); String msg = dataInput.readUTF(); System.out.println(msg); // 判断输入,进行相应的操作 dataOutput = new DataOutputStream( clientSocket.getOutputStream()); if ("shutdown".equals(msg)) { shutdown(); // 发送消息回Android端 send_msg = "60秒后关机 "; } else if ("reboot".equals(msg)) { reboot(); send_msg = "60秒后重启"; } else if ("cancel".equals(msg)) { cancel(); send_msg = "取消关机或重启"; } } catch (Exception e) { } finally { try { if (dataOutput != null) { dataOutput.writeUTF(send_msg); dataOutput.close(); } dataInput.close(); // 关闭连接 clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } catch (Exception e) { e.printStackTrace(); } } // 关机 private static void shutdown() throws IOException { Runtime.getRuntime().exec("shutdown -s -t 60"); System.out.println("shutdown ,60 seconds later "); } // 重启 private static void reboot() throws IOException { Runtime.getRuntime().exec("shutdown -r -t 60"); System.out.println("reboot ,60 seconds later "); } // 取消关机或重启 private static void cancel() throws IOException { Runtime.getRuntime().exec("shutdown -a"); System.out.println("cancel shutdown or restart"); } }
运行后,效果如下:
1、一直在监听端口30000
2、当Android客户端发送关机请求后
3、当Android客户端发送取消关机请求后
4、当Android客户端发送重启请求后
====================================================================================
作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!
转载请保留原文地址:http://blog.csdn.net/ouyang_peng
====================================================================================