UDPでデータ送信する方法のひとつに、Java Appletによる方法があったので、その方法を試してみた。
Java Appletについては最近の文献も少なく少し苦労した。たとえば、1度ブラウザでロードしたクラスファイルを再読込するには、Javaコンソールからキャッシュを明示的にクリアする点などはなかなか分からなかった。
特に署名付きAppletを作ったのははじめてだったので、そのあたりでも骨が折れた。

・コード
送信側コード。至って単純。

import java.awt.Color;
import java.awt.Graphics;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class SenderApp extends Applet {
	public void paint(Graphics g) {
		try {
			// 通信用ソケット準備
			DatagramSocket sock = new DatagramSocket();

			/*** UDPパケット送信 ***/
			// 送信文字列準備
			String sendString = "test message";
			byte[] sendBuffer = sendString.getBytes("JIS");	// 文字コードの指定
			// ソケット準備
			InetSocketAddress remoteAddress = new InetSocketAddress("127.0.0.1",13500);
			// UDPパケット作成
			DatagramPacket sendPacket = new DatagramPacket(sendBuffer, sendBuffer.length, remoteAddress);
			
			// 送信
			sock.send(sendPacket);			
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
続いて受信側。これまた単純。
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class ReceiverApp extends Applet {
	public void paint(Graphics g) {
			try {
				
				/***** UDPパケット受信 *****/
				DatagramSocket receiveSocket = new DatagramSocket(13500);
				
				// 再利用可能にする
				// receiveSocket.setReuseAddress(true);

				// 受信バッファ
				byte[] receiveBuffer = new byte[100];
				// 受信パケット
				DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, 100);
				// 受信
				receiveSocket.receive(receivePacket);
				// 受信文字列格納
				String receiveString = new String(receivePacket.getData());

				// ソケットを閉じる
				receiveSocket.close();
				
				// 描画!
				g.setColor(Color.RED);
				g.drawString(receiveString, 30, 30);
				
			} catch (SocketException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
	}
}
ソースコードは以上。コーディングの際には下記のサイトを参考にした。

Javaの道 >  掲示板 >  回答(JavaアプレットからUDPにメッセージ送信したい)
http://www.javaroad.jp/bbs/answer.jsp?q_id=20060907104644159

【コラム】 ライトニングJava
http://journal.mycom.co.jp/column/java/052/index.html

・署名付きAppletの作成
はじめてだったので検討もつかなかった作業。
以下のサイトが詳しい。ちなみに私は実はJDKが入っていなくてまずそのインストールからはじめました。。。

Java RADKRAFT: Java Applet + SignatureApplet マイク
http://kamakura.cool.ne.jp/oppama/misc/java-plugin-sig.html

・CLASSファイルではなくJARファイルを読み込むHTMLの書き方
テクニカルQ&A  Java 04 - アプレットで .zip や .jar ファイルを使う
http://developer.apple.com/jp/qa/java/java04.html

盲点。
先日の記事で「JobsはJavaが嫌い~」とか言っていたのに、皮肉なことにAppleのWebサイト。しかも12年前の記事。笑。

・CLASS/JARファイルを更新したらキャッシュを明示的にクリア
以下のサイトがなかったらずっとはまっていたと思う。
Java Appletの記事で2005年は比較的新しい。。笑。

Java Primer: アプレットの再読み込み
http://mibai.tec.u-ryukyu.ac.jp/~oshiro/Doc/java_primer/AppletReload.html

とりあえず、これらの情報を参考に上記のコードからCLASSファイル、JARファイル、keyによる署名を行ったところ、localhost同士ではうまく通信できた。
あとは実際にNATを越えてUDP通信する方法について考える必要がある。
試しにネットワーク外部の人と通信を試みたが失敗。。。NATの設定の問題によると思うので、ひとまず固定IPの相手と通信が確立した後、改めて検討したい。

この記事についてTwitterでつぶやく