Categories: ActionScript3.0

policy-file-requestの対処法

最新のFlash Playerでは、サーバーと通信するとき、\0(\0はNULL文字)という文字列を送信してきます。これに対して\0というような文字列を返してやらないと、まったく通信できません。
そこでその文字列を返す方法を探って見たところ、色々方法があったのでメモ。


1.rubyの場合

いまさら画期的な発見!まずは長い前置きから。 最新のFlash Playerでは、SocketまたはXMLSocketを使ってサーバーと通信するとき、最初に\0(\0はNULL文字)という文字列を送信してきます。これに対して\0というような文字列を返してやらないと、まったく通信できません。 これは(HTTPサーバーでホスティングする)crossdomain.xmlファイルとは関係…
Flash Player 9,0,115,0のに対処する方法 - Blog by Sadayuki Furuhashi - Blog by Sadayuki Furuhashi
主な仕組みなどはここみれば大体わかるかな?
ついでにrubyバージョンの方法もあったのでメモ。

require ‘socket’
require ‘rexml/document’
if ARGV.empty?
puts “Usage: #{File.basename($0)}
exit 1
end
policy = File.read(ARGV[0]) + “\0”
REQUEST_LIMIT = 32
def log(addr, msg)
puts “#{addr} #{msg}”
end
srv = TCPServer.open(843)
while true
Thread.start(srv.accept) {|s|
port, addr = Socket.unpack_sockaddr_in( s.getpeername )
begin
log addr, “connection accepted”
buf = “”
begin
buf REQUEST_LIMIT
end until buf.include?(“\0”)
log addr, “received request #{buf.inspect}”
req = REXML::Document.new(buf)
unless req.root.name == “policy-file-request”
raise “invalid request”
end
log addr, “sending policy file”
s.write policy
rescue
log addr, “invalid request: #{$!.inspect}”
ensure
s.close
end
}
end

でも実際につかってみたら、

C:/ruby/socket.rb:16:in `‘: uninitialized constant TCPServer (Na
meError)
from c:/ruby/socket.rb:1:in `require’
from c:/ruby/socket.rb:1:in `

っていわれて使えなかったので使うのあきらめた。
PHPの場合


- ammonlauritzen.com
ここから引用

<?php
if( posix_getuid() != 0 ) // これはWindows環境では使えない関数なので、Windowsの場合はここを削除
die( “You must run this script as root.\n” );
$sock = @socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
if( !$sock )
die( “Unable to create socket.\n” );
$succ = @socket_bind( $sock, “0.0.0.0”, 843 );
if( !$succ )
die( “Unable to bind to port 843.\n” );
$succ = @socket_listen( $sock );
if( !$succ )
die( “Unable to start listening.\n” );
while( true ) {
$r = $w = $e = array( $sock );
if( @socket_select( $r, $w, $e, null ) !== false ) {
$conn = @socket_accept( $sock );
if( $conn !== false ) {
socket_write( $conn, $policy_file );
socket_close( $conn );
} else {
echo “socket_accept() failed?\n”;
break;
}
} else {
echo “socket_select() failed?\n”;
break;
}
}
socket_close( $sock );

c:\php\php c:\www/socket.phpとコマンドプロンプトで実行しておくことでソケットをまちうけている状態にして、動作することができた。
Javaの場合

import java.net.Socket;
import java.net.ServerSocket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.IOException;
public class socket {
public static final int ECHO_PORT = 843;
public static void main(String args[]) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(ECHO_PORT);
System.out.println(“Serverが起動しました(port=” + serverSocket.getLocalPort() + “)”);
while (true) {
Socket socket = serverSocket.accept();
new EchoThread(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (serverSocket != null) {
serverSocket.close();
}
} catch (IOException e) {
}
}
}
}
class EchoThread extends Thread {
private Socket socket;

public EchoThread(Socket socket) {
this.socket = socket;
System.out.println(“接続されました ” + socket.getRemoteSocketAddress());
}
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
//   out.println(“"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\">“);
out.println(““);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null) {
socket.close();
}
} catch (IOException e) {}
System.out.println(“切断されました ” + socket.getRemoteSocketAddress());
}
}
}

Javaだったら大体環境も容易されてるしで、実行しやすいかな?
Adobe Flash CS4 詳細!ActionScript3.0入門ノート[完全改訂版](CD-ROM付)


Adobe Flash CS4 Professional (V10.0) 日本語版 Windows版
mogmet

View Comments

Share
Published by
mogmet