Wake on LAN してみる Part 2

今回も前回に引き続き Wake on LAN について...

前回は Wake on LAN で送信するマジックパケットJavaFX で表現してみましたが...
今回は 実際に Wake on LAN 対応の PC を起動するための処理を JavaFX で実装してみました。

Wake on LAN 対応の PC を起動するには

マジックパケット (前回の記事参照) を任意のポートにブロードキャストする
だけでよいので とっても簡単!! 実装もたったこれだけ...
もちろん、いつもの通り 例外処理等は全く考慮していません。

ちなみに 今回は 同じネットワーク内の PC だけを対象としているため ブロードキャストアドレスを 255.255.255.255 としています。
別のネットワークにブロードキャストする場合は 適宜ブロードキャストアドレスを設定すればよいはずです。

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.lang.Integer.parseInt;

// 起動する PC の NIC の MAC アドレス
def macAddress = "aa:bb:cc:dd:ee:ff";

// マジックパケット
def magicPacket = [ 
    for(i in [1..6]) { 0xff },
    for(i in [1..16], b in macAddress.split(":")) { parseInt(b, 16) } 
];

// 同一ネットワークへのブロードキャストアドレス (255.255.255.255)
def broadcastAddress = InetAddress.getByAddress([255, 255, 255, 255]);

// マジックパケットを任意のポートにブロードキャストするための UDPデータグラムパケット
def packet = new DatagramPacket(magicPacket, sizeof magicPacket, broadcastAddress, 5555);

// マジックパケット 送信
def socket = new DatagramSocket();
socket.send(packet);

UDP 通信するためのプログラムとしては 特筆するべき点もありませんが...
強いて書くなら JavaFX の特徴として 配列とシーケンスは同等で扱えるということぐらいでしょうか。

ブロードキャストアドレスを取得するための
InetAddress.getByAddress(byte[] b)

や DatagramPacket のコンストラク

DatagramPacket(byte[] b, int length, InetAddress address, int port)
は 引数に byte の配列を指定します。ところが JavaFX には 配列がない...
でっ... その代わりとしてシーケンスというデータ型が存在する訳なのです。
シーケンスは配列とは全く別ものなのですが、配列としても使える不思議なデータ型です。
その為、配列の引数に 何も考えず 指定できるのです。

このプログラムは まだ画面がないので はっきり言ってしまえば JavaFX で実装する意味はほとんどないです。
一応、コマンドラインから

javafxc Main.fx
javafx Main
と入力すれば実行できます。