java版本远程唤醒设备

package anyang.wakeonlan;

import java.io.IOException;
import java.net.*;

public class WakeOnLan3 {
    /**
     * 虽然使用的是UDP协议,但是TCP也是可以的,只要数据包内包含的信息匹配就行了
     * MagicPacket正统译名叫魔术数据包,翻译成魔法数据包也差不多嘛,此程序因而得名S_Wand(Shanwer的魔法棒)
     * 参照了博客:https://blog.csdn.net/u013363811/article/details/44343437/
     * 命令行参数用来自定义主机地址,MAC地址,端口
     * 比如 java -jar S_Wand test.top AA-BB-CC-DD-EE-FF 9,MAC加':"也行,但形如AABBCCDDEEFF是不可以的
     */
    public static void main(String[] args) {
        try {
            //InetAddress address = InetAddress.getByName(args[0]);//域名地址,IP地址也是可以的
            //String ip = "192.168.11.201";//解析域名(IP)到IP
            String ip = "255.255.255.255";
            String MAC = "10-7B-44-80-94-AA";//MAC地址的原始地址,需要加入":"与"-"
            //String MAC="A8-5E-45-9C-B9-1E";
            //话说String MAC = args[1].replaceAll("(?::|-)","");和上面一行居然是等效的,这也许就是正则表达式吧,i了i了
            String port = "9090";//端口号
            //将MAC地址转换为2进制
            byte[] MACTo2Bits = getMacBytes(MAC);
            try {
                byte[] magic = new byte[102];
                for (int i = 0; i < 6; i++)
                    magic[i] = (byte) 0xFF;
                //从第7个位置开始把MAC地址放入16次
                for (int i = 0; i < 16; i++) {
                    for (int j = 0; j < MACTo2Bits.length; j++) {
                        magic[6 + MACTo2Bits.length * i + j] = MACTo2Bits[j];
                    }
                }
                DatagramPacket packet = new DatagramPacket(magic, magic.length, InetAddress.getByName(ip), Integer.parseInt(port));
                //创建套接字
                DatagramSocket socket = new DatagramSocket();
                //发送数据
                socket.send(packet);
                //关闭socket
                socket.close();
                /*
                System.out.println("[DEBUG]发送的数据包内容");
                for (byte s : magic) {
                    System.out.print(s);
                }
                */
               System.out.println("\n add:" + InetAddress.getByName(ip) + ",port:" + Integer.parseInt(port) + ",发送了魔法数据包");
            } catch (IOException e) {
                //获取socket失败时候抛出的异常
                e.printStackTrace();
            }
        } catch (ArrayIndexOutOfBoundsException e) {
            //一般是命令行参数不全导致的
            e.printStackTrace();
            for (String errorString : args) {
                System.out.println("你输入的命令行参数有误,示例:java -jar S_Wand test.top AA-BB-CC-DD-EE-FF 9,你输入的命令行参数为:" + errorString);
            }
        }
    }
    private static byte[] getMacBytes(String macStr) throws IllegalArgumentException {
        //MAC地址转换二进制方法
        byte[] bytes = new byte[6];
        String[] hex = macStr.split("([:\\-])");
        if (hex.length != 6) {
            throw new IllegalArgumentException("无效的MAC地址");
        }
        try {
            for (int i = 0; i < 6; i++) {
                bytes[i] = (byte) Integer.parseInt(hex[i], 16);
            }
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("无效的MAC地址");
        }
        return bytes;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值