java代码实现网络远程开机
2024-09-01 06:09:55
http://my.oschina.net/kingfire/blog/156764
概述
远程开机(Wake onLAN)是指通过网络实现对服务器或者pc启动运行,现在很多网卡都支持的这个功能. 其原理简单来说是向目标主机发送特殊格式的数据包, 目标主机收到后,对系统进行启动.
具体方法.
设置bios开启Wake onLAN(WOL)功能
查看主机网卡的mac地址
将主机通过网卡连接到以太网上
发送开机编码,启动系统
其实就是通过socket向目标的机器发送MagicPacket(魔术包),魔术包的格式,包含有连续6个字节的“FF”和连续重复16次的MAC地址。你可以在任何协议的数据包(如在TCP/IP、IPX包)中填上 “FFFFFFFFFFFF”+连续重复16次的MAC地址,就可利用该协议作出一个使用该协议的MagicPacket。只要NIC检测到数据包中任何地方有这样的片段,便会将计算机唤醒。发送数据包的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; } |
可能遇到的问题
在路由器环境下,想在公网实现对内网电脑开机
需要设置路由器的ip映射,将外网地址映射为内网地址,比如tp-link的dmz主机设置.
将目标主机(mac:01-12-43-44-D5-56)的ip地址设置为静态ip,比如192.168.0.99, 然后在路由器也绑定mac和ip家里的公网ip一直变化
可以在路由器里面绑定花生壳(移动铁通可能要付费了选择服务器,才能正确解析ip).
也可以采用变成,定时访问ip地址解析网页比如:http://www.ip138.com,然后将ip地址报告到公网的网站.
ps:本人用一个废弃的安卓手机写了一个周期性报告家里ip地址的程序,每天开着,向自己的公网web服务器报告家里ip嘿嘿
参考资料
最新文章
- IP釋放、清除、以及刷新DNS
- 搭建高可用mongodb集群(一)——配置mongodb
- scala 学习: case class
- mysql增加普通用户后无法登陆问题的解决方法
- 基础1 JavaSe基础
- Prim算法POJ1258
- jQuery通过jquery.form.js插件使用AJAX提交Form表单
- Struts2 中的值栈的理解
- Archlinux 踩坑实录
- Quartz定时任务学习(五)触发器
- 禁用ubuntu的触摸板和独显
- JavaScript快速入门(五)——表达式运算
- 励研(LY) CRC16算法
- 学习笔记——Java包装类
- ectouch 概述
- oi回忆录
- Okhttp、Volley和Gson的简单介绍和配合使用
- 源码的excel导入导出
- 48-Python 安装pyautogui失败解决办法
- Java知多少(91)对话框
热门文章
- ConfigurationManager 引用
- ZetCode PyQt4 tutorial signals and slots
- [QT][SQLITE]学习记录二 日期查询
- flask第二十三篇——模板【5】过滤器
- 490 - Rotating Sentences
- Python 缓存机制与 functools.lru_cache(zz)
- nats 学习 request/reply 模式基本使用
- iOS 基础类解析 - NSDate
- BUG的定位与分析思路
- clamav完整查杀linux病毒实战(转)