首页>代码>java swing开发的socket远程控制开关机服务>/shutdown-client/src/cn/verp/server/RemoteWakeUpService.java
package cn.verp.server;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * 远程开机
 * @author Administrator
 */
public class RemoteWakeUpService {
	public static String getIP(String name) {
		System.out.println("当前服务器地址是域名格式,正在解析对应的IP地址....");
		InetAddress address = null;
		String ip = null;
		try {
			address = InetAddress.getByName(name);
			ip = address.getHostAddress().toString();
		} catch (UnknownHostException e) {
			System.out.println("根据域名获取IP失败");
			return ip;
		}
		System.out.println("已获取到域名对应的IP地址:"+address);
		return ip;
	}
	
	public static boolean remoteBoot(String macAddress, String destIP, int port) throws IOException{
		//检查mac地址格式
		macAddress = formatMacAdr(macAddress);
		
		// 检测 mac 地址,并将其转换为二进制
	    byte[] destMac = getMacBytes(macAddress);
	    if (destMac == null){
	    	return false;
	    }
	    
	    //如果输入的是域名非IP
	    if (!isIpv4(destIP)) {
	    	destIP = getIP(destIP);
		}

	    if (destIP == null || destIP.length()<1) {
			return false;
		}
	    
	    InetAddress destHost = InetAddress.getByName(destIP);
	    byte[] magicBytes = new byte[102];
	    // 将数据包的前6位放入0xFF即 "FF"的二进制
	    for (int i = 0; i < 6; i++){
	    	magicBytes[i] = (byte) 0xFF;
	    }
	        
        // 从第7个位置开始把mac地址放入16次
        for (int i = 0; i < 16; i++) {
            for (int j = 0; j < destMac.length; j++) {
                magicBytes[6 + destMac.length * i + j] = destMac[j];
            }
        }
        // create packet
        DatagramPacket dp = null;
        dp = new DatagramPacket(magicBytes, magicBytes.length, destHost, port);
        DatagramSocket ds = new DatagramSocket();
        System.out.println("准备发送魔术包唤醒远程电脑....");
        ds.send(dp);
        ds.close();
        System.out.println("唤醒指令发送成功....");
        return true;
	}

	private static byte[] getMacBytes(String macStr) throws IllegalArgumentException {
	    byte[] bytes = new byte[6];
	    String[] hex = macStr.split("(\\:|\\-)");
	    if (hex.length != 6) {
	        throw new IllegalArgumentException("Invalid MAC address.");
	    }
	    try {
	        for (int i = 0; i < 6; i++) {
	            bytes[i] = (byte) Integer.parseInt(hex[i], 16);
	        }
	    } catch (NumberFormatException e) {
	        throw new IllegalArgumentException("Invalid hex digit in MAC address.");
	    }
	    return bytes;
	}

	
    private static boolean isIpv4(String ipAddress) {  
        StringBuffer ipRgex = new StringBuffer();
        ipRgex.append("^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\.")
          .append("(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\.")
          .append("(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\.")
          .append("(00?\\d|1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$")
          ;
  
        Pattern pattern = Pattern.compile(ipRgex.toString());  
        Matcher matcher = pattern.matcher(ipAddress);  
        return matcher.matches();  
    }  
    
    private static String formatMacAdr(String macAddr){
    	String mac = null;
    	StringBuffer macRegx = new StringBuffer();
    	macRegx.append("([a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2})")
         	   .append("|([a-fA-F0-9]{2}-[a-fA-F0-9]{2}-[a-fA-F0-9]{2}-[a-fA-F0-9]{2}-[a-fA-F0-9]{2}-[a-fA-F0-9]{2})")
        ;
    	if (macAddr.matches(macRegx.toString())) {
			mac = macAddr;
		}else if (macAddr.length()==12) {
			int i =0;
	    	StringBuffer b = new StringBuffer();
	    	do {
				b.append(macAddr.substring(i, i=i+2)).append(":");
			} while (i<12);
	    	b = b.deleteCharAt(b.length()-1);
			mac = b.toString();
		}
    	return mac;
    }
    
    
    
    /*public static void main(String[] args) throws IOException {
	    int port = 20105;
	    String macAddress = "2C-56-DC-97-E7-9F";
	    String domian = "wb4j.com";
	    String destIP = getIP(domian);// 广播地址
	    
	    System.out.println(destIP);
		System.out.println();
		
		try {
			remoteBoot("2c-56-dc-97-e7-9f", "uxx.gg", 3377);
		} catch (IOException e) {
			System.out.println("唤醒失败");
			e.printStackTrace();
		}
		
		System.out.println(formatMacAdr("2C56DC97E79F"));
    }*/
}
最近下载更多
微笑刺客  LV19 2023年1月13日
ewan007  LV30 2022年4月24日
露无畏  LV12 2022年4月18日
tangjj7260  LV18 2021年12月10日
一个好人520  LV10 2021年9月29日
675104182  LV14 2020年9月22日
huzh035  LV3 2020年2月19日
子不语103  LV7 2020年1月19日
pipulu  LV1 2019年9月24日
adminroot777  LV8 2019年9月23日
最近浏览更多
3334004690  LV10 5月28日
uid0901  LV2 4月2日
痴汉hug个人民 2023年2月21日
暂无贡献等级
微笑刺客  LV19 2023年1月13日
taoyi123  LV17 2022年12月29日
aixiao5213  LV1 2022年12月28日
炫瓶百事可乐  LV1 2022年12月1日
ewan007  LV30 2022年4月24日
1265260263  LV4 2022年4月8日
17842711  LV1 2022年3月27日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友