URLMonitorは何を送ってくるのか

AIRのクラスに、air.net.URLMonitorというクラスがあります。
このクラスは、指定のURLがサービス状態にあるかどうかをチェックしてくれるクラスです。
使い方は、こんな感じです。

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="{init()}">
	<mx:Script>
		<![CDATA[
			import air.net.ServiceMonitor;
			import air.net.URLMonitor;
			private var monitor:URLMonitor;
			private var count:int = 0;
			
			public function init():void{
				var endPoint:URLRequest = new URLRequest("http://localhost:8080/amftest/monitor");				
				monitor = new URLMonitor(endPoint);
				monitor.poolInterval=1000;//1秒ごとにチェック
				monitor.addEventListener(StatusEvent.STATUS,handleMonitor);
				monitor.start();
			}
			public function handleMonitor(e:StatusEvent):void{
				count++;
				var status:String = (monitor.available) ? "AVAILABLE" : "NOT AVAILABLE";
				var color:Number = (monitor.available) ?  0x00FF7F : 0x3C14DC;
				statusLabel.text = status+" count:"+count;
				statusLabel.setStyle("color",color);				 
			}
		]]>
	</mx:Script>
	<mx:Text id="statusLabel" width="100%"/>
</mx:WindowedApplication>

監視したいURLRequestを引数に、URLMonitorをインスタンス化します。
あとはStatusEvent.STATUSイベントにイベントリスナーをつけておけば、ステータスを通知してくれます。


ポーリング間隔はデフォルトで0がセットされています。0の場合、monitor.start()を呼んだタイミングと、
ネットワーク状態が変更になったときのみポーリングします。
定期的にポーリングしたい場合は、monitor.poolIntervalで間隔をセットします(単位はms)。


注意したいのは、StatusEvent.STATUSイベントが呼ばれるタイミングです。
私のイメージでは、ポーリング後には必ずイベントが発生すると思っていたのですが、どうやらそうではなく
初回と、その後にステータスに変更があった時だけしか呼ばれないようです。
(上記プログラムだと、1秒に1回countが上がる予定でしたが、そうではない)


これを踏まえて、AIRクライアントでURLMonitorを利用する時、サーバ側で何をすべきかを探るべく、AIRが何を送ってくるのかをデバックしてみました。
結果としてはこんな感じです。

 GET /amftest/monitor HTTP/1.1
 Referer: app:/AMFTestAIR.swf
 Accept: text/xml, application/xml, application/xhtml+xml, text/html;q=0.9, text/plain;q=0.8, text/css, image/png, image/jpeg, image/gif;q=0.8, application/x-shockwave-flash,video/mp4;q=0.9, flv-application/octet-stream;q=0.8, video/x-flv;q=0.7, audio/mp4, application/futuresplash, */*;q=0.5
 x-flash-version: 9,0,115,0
 User-Agent: Mozilla/5.0 (Windows; U; en) AppleWebKit/420+ (KHTML, like Gecko) AdobeAIR/1.0
 Host: localhost:8080
 Connection: Keep-Alive
 Cache-Control: no-cache
 X-ProcessAndThread: adl.exe [1756; 1536]

送られてきたHTTPヘッダ。シンプルなGETリクエストです。
GETなので、Bodyには何も入ってません。
変わっている点は、RefererとかUserAgentぐらいでしょうか。


サーブレットは、200のステータスを返すとクライアント側に正常稼動だと示すことが出来るようです。
従って、ポーリングを受けるサーブレット

public class AMFTestURLMonitorServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		res.setStatus(200);
	}
}

だけでよいようです。
ちなみに、setStatusで500や404をセットすると、クライアント側はちゃんと「使えない」と分かってくれました。


URLMonitorからの通信は、AMF通信用のようにヘッダーからは判定しにくいので、ポーリング用のURLをひとつ作ってそこに上記のようなサーブレットをおいておくか、
もしくはダミーファイルをアプリに同梱しておき、FileSavingServletに200ステータスを返してもらうのがよさそうです。