java代码实现远程开机20191227

需要BIOS,主板等支持,并且需要相应设置。不同电脑不同设置,具体如何设置请百度。

除了实现远程开机还可以实现远程关机、休眠等,本文只写远程开机,其他自行百度。

实现远程开机需要目标ip地址、mac地址和子网掩码

 

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * @description TODO
 * @time 2019/12/26 16:56:15
 */
public class WakeUpUtils {

	/**
	 * 唤醒主机
	 * 
	 * @param ip         目标ip地址
	 * @param mac        目标mac地址
	 * @param subnetMask 目标子网掩码
	 */
	public static void wakeUpDevice(String ip, String mac, String subnetMask) {
		ip = ip.trim();
		mac = mac.trim();
		subnetMask = subnetMask.trim();
		String broadcastAddress = getBroadcastAddress(ip, subnetMask);
		mac = mac.replace("-", "");
		wakeBy(broadcastAddress, mac, 389);
		System.out.println("已经发送远程开机代码");
	}

	/**
	 * 网络唤醒
	 * 
	 * @param ip   主机ip
	 * @param mac  主机mac
	 * @param port 端口
	 */
	private static void wakeBy(String ip, String mac, int port) {
		// 构建magic魔术包
		String MagicPacage = "FFFFFFFFFFFF";
		for (int i = 0; i < 16; i++) {
			MagicPacage += mac;
		}
		byte[] MPBinary = hexStr2BinArr(MagicPacage);
		try {
			InetAddress address = InetAddress.getByName(ip);
			DatagramSocket socket = new DatagramSocket(port);
			DatagramPacket packet = new DatagramPacket(MPBinary, MPBinary.length, address, port);
			// 发送udp数据包到广播地址
			socket.send(packet);
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static byte[] hexStr2BinArr(String hexString) {
		String hexStr = "0123456789ABCDEF";
		int len = hexString.length() / 2;
		byte[] bytes = new byte[len];
		byte high = 0;
		byte low = 0;
		for (int i = 0; i < len; i++) {
			high = (byte) ((hexStr.indexOf(hexString.charAt(2 * i))) << 4);
			low = (byte) hexStr.indexOf(hexString.charAt(2 * i + 1));
			bytes[i] = (byte) (high | low);
		}
		return bytes;
	}

	// 根据子网掩码和ip得到主机的广播地址
	private static String getBroadcastAddress(String ip, String subnetMask) {
		String ipBinary = toBinary(ip);
		String subnetBinary = toBinary(subnetMask);
		String broadcastBinary = getBroadcastBinary(ipBinary, subnetBinary);
		String wholeBroadcastBinary = spiltBinary(broadcastBinary);
		return binaryToDecimal(wholeBroadcastBinary);
	}

	// 二进制的ip字符串转十进制
	private static String binaryToDecimal(String wholeBroadcastBinary) {
		String[] strings = wholeBroadcastBinary.split("\\.");
		StringBuilder sb = new StringBuilder(40);
		for (int j = 0; j < strings.length; j++) {
			String s = Integer.valueOf(strings[j], 2).toString();
			sb.append(s).append(".");
		}
		return sb.toString().substring(0, sb.length() - 1);
	}

	// 按8位分割二进制字符串
	private static String spiltBinary(String broadcastBinary) {
		StringBuilder stringBuilder = new StringBuilder(40);
		char[] chars = broadcastBinary.toCharArray();
		int count = 0;
		for (int j = 0; j < chars.length; j++) {
			if (count == 8) {
				stringBuilder.append(".");
				count = 0;
			}
			stringBuilder.append(chars[j]);
			count++;
		}
		return stringBuilder.toString();
	}

	// 得到广播地址的二进制码
	private static String getBroadcastBinary(String ipBinary, String subnetBinary) {
		int i = subnetBinary.lastIndexOf('1');
		String broadcastIPBinary = ipBinary.substring(0, i + 1);
		for (int j = broadcastIPBinary.length(); j < 32; j++) {
			broadcastIPBinary = broadcastIPBinary + "1";
		}
		return broadcastIPBinary;
	}

	// 转二进制
	private static String toBinary(String content) {
		String binaryString = "";
		String[] ipSplit = content.split("\\.");
		for (String split : ipSplit) {
			String s = Integer.toBinaryString(Integer.valueOf(split));
			int length = s.length();
			for (int i = length; i < 8; i++) {
				s = "0" + s;
			}
			binaryString = binaryString + s;
		}
		return binaryString;
	}
}

 

具体转载 http://www.freebytes.net/it/java/wakeonlan.html

你可能感兴趣的:(java代码实现远程开机20191227)