XMLSocketで接続する際のポリシーファイル

http://livedocs.adobe.com/flash/9.0_jp/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00001087.html
 Flash Player 7 以降では外部に対してXMLSocket接続する場合、ポリシーファイルをサーバー側から返してあげないといけないらしい。

System.security.loadPolicyFile("xmlsocket://adobe.com:414");

 こうやって、直接ファイルを指定するのではなくてホストアドレスとポート番号を指定する場合、一度Socketの接続を確立した後にすぐに "" という文字列が送信されるので、ポリシーファイルの文字列をサーバー側から返してあげれば行けた。

 最初かなりつまっていて、なぜかflash側の接続が切れる瞬間(ページを閉じるとか)に "" の文字列が送られて来ていて理解できなかったんだけど、サーバー側の問題だった。サーバー側(java)のコードを書き直したら上手くサーバー側から、ポリシーファイルのXMLを返す事が出来た。

 原因は調べてない。どちらも、どこかの解説サイトを参考にした。クライアント側がASを使う前提で解説しているページがいいかもしれない。

上手くいったコード

public void run() {
	while(isConnecting) {
		try {
			String inputLine = "";

			// new code
			int c = in.read();
			if(c == -1) {//close
				// クライアント側が切断
				break;
			}
			while ( c != '\0') {
				inputLine += (char)c;
				c = in.read();
			}
			inputLine = inputLine.trim();
			if(checkPolicyFile(inputLine)) {
				// クライアントとの切断処理
				break;
			} else {
				// ポリシーファイル要求でないのでメッセージを返す
				out.println("return:"+inputLine+" "+System.currentTimeMillis());
			}
		} catch (IOException e) {
			// クライアントとの切断処理
		} catch (Exception e) {
			// クライアントとの切断処理
		}
	}
	// クライアント側が切断
}

private boolean checkPolicyFile(String str) {
	if(str.equals("<policy-file-request/>")) {
		String xml = "<cross-domain-policy><allow-access-from domain=\"" +
		"*" +
		"\" to-ports=\""+
		"*" + "\" /></cross-domain-policy>";
		out.println(xml);
		return true;
	}
	return false;
}


駄目だったコード

public void run() {
	while(isConnecting) {
		try {
			String inputLine;
			while ((inputLine = in.readLine()) != null) {
				inputLine = inputLine.trim();
				if(checkPolicyFile(inputLine)) {
					// クライアントとの切断処理
					break;
				} else {
					// ポリシーファイル要求でないのでメッセージを返す
					out.println("return:"+inputLine+" "+System.currentTimeMillis());
				}
			}
		} catch (IOException e) {
			// クライアントとの切断処理
		} catch (Exception e) {
			// クライアントとの切断処理
		}
		// クライアント側が切断
	}
}