博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java代码实现网络远程开机
阅读量:6735 次
发布时间:2019-06-25

本文共 2263 字,大约阅读时间需要 7 分钟。

http://my.oschina.net/kingfire/blog/156764

概述

远程开机(Wake onLAN)是指通过网络实现对服务器或者pc启动运行,现在很多网卡都支持的这个功能. 其原理简单来说是向目标主机发送特殊格式的数据包, 目标主机收到后,对系统进行启动.

具体方法.

  1. 设置bios开启Wake onLAN(WOL)功能

  2. 查看主机网卡的mac地址

  3. 将主机通过网卡连接到以太网上

  4. 发送开机编码,启动系统 

    其实就是通过socket向目标的机器发送MagicPacket(魔术包),魔术包的格式,包含有连续6个字节的“FF”和连续重复16次的MAC地址。你可以在任何协议的数据包(如在TCP/IP、IPX包)中填上 “FFFFFFFFFFFF”+连续重复16次的MAC地址,就可利用该协议作出一个使用该协议的MagicPacket。只要NIC检测到数据包中任何地方有这样的片段,便会将计算机唤醒。

  5. 发送数据包的java代码

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public
static
void
main(String[] args)
throws
IOException {
    
int
port =
20105
;
    
String macAddress =
"01-12-43-44-D5-56"
;
    
// String destIP = "255.255.255.255";// 广播地址
    
String destIP =
"112.11.15.28"
;
// 广播地址
    
// 检测 mac 地址,并将其转换为二进制
    
byte
[] destMac = getMacBytes(macAddress);
    
if
(destMac ==
null
)
        
return
;
 
    
InetAddress destHost = InetAddress.getByName(destIP);
    
// construct packet data
    
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();
        
ds.send(dp);
        
ds.close();
        
System.out.println(
"ok"
);
}
 
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;
}

可能遇到的问题

  1. 在路由器环境下,想在公网实现对内网电脑开机 

    需要设置路由器的ip映射,将外网地址映射为内网地址,比如tp-link的dmz主机设置. 
    将目标主机(mac:01-12-43-44-D5-56)的ip地址设置为静态ip,比如192.168.0.99, 然后在路由器也绑定mac和ip

  2. 家里的公网ip一直变化 

    可以在路由器里面绑定花生壳(移动铁通可能要付费了选择服务器,才能正确解析ip). 
    也可以采用变成,定时访问ip地址解析网页比如:,然后将ip地址报告到公网的网站. 
    ps:本人用一个废弃的安卓手机写了一个周期性报告家里ip地址的程序,每天开着,向自己的公网web服务器报告家里ip嘿嘿

参考资料

转载于:https://www.cnblogs.com/heidsoft/p/4011800.html

你可能感兴趣的文章
HttpClient——概述(一)
查看>>
初探ECMAScript6
查看>>
我的MYSQL学习心得(一) 简单语法
查看>>
加速scp传输速度
查看>>
MAC MAMP php安装memcache扩展安装方法
查看>>
异步与回调
查看>>
Electron入门教程
查看>>
通读ES6--数值的扩展
查看>>
Flink实时计算性能分析
查看>>
参加51CTO学院软考培训,我通过啦
查看>>
阿里云梁楹:这样的青春,别样的精彩
查看>>
Pandas - 快速入门
查看>>
通过java流实现读取文件
查看>>
Log4j 基本使用
查看>>
ssh 通过sshpass自动登录远程主机
查看>>
Eclipse/MyEclipse 常用的快捷键
查看>>
wordpress获取当前分类下的子分类
查看>>
解决Spring MVC @ResponseBody返回中文字符串乱码问题
查看>>
RecyclerView和LinearLayoutManager经常用到的几个方法
查看>>
Apache虚拟主机
查看>>