2011-12-22 13 views
0

私は既にこの質問をしている人が多いと知っていますが、私が読んだすべてのスレッドでは、私の問題に対して1つの解決策を見つけることができませんでした私のために働かなかった)。Java <->フラッシュソケット - ポリシーファイルの問題

タイトルが言うように、私はFlash/SWF-Applicationから、ソケットを介して書いた小さなJavaサーバーに接続しようとしています。 (同じマシン上で)オフラインで正常に動作しますが、.swfをWebスペースに配置してそこから開くとすぐに、Flashはサーバーからポリシーファイルを要求します。何も悪いことはありませんが、私の問題は、Flashが(うまくいけば)ポリシーファイルを取得した後に切断されますが、再接続しないことです。

クライアントが接続すると、私のサーバは常に新しいスレッドを開きますが、問題が発生した場所ではありません。私はすでに新しいスレッドを開かずに試しました。

は、ここに私のコードです:

while (true) { 
    connection = providerSocket.accept(); 
    System.out.println("Incoming connection from " + 
     connection.getInetAddress().getHostName()); 
    BufferedReader in = new BufferedReader(
     new InputStreamReader(connection.getInputStream())); 
    String request = in.readLine(); 

    if (request != null && request.contains("<policy-file-request/>")) { 
     System.out.println("Authorization request."); 
     PrintStream out = new PrintStream(connection.getOutputStream(), true); 
     out.println("<?xml version=\"1.0\"?><cross-domain-policy><!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\"><allow-access-from domain=\"*\" to-ports=\"3002\" /></cross-domain-policy>\u0000"); 
     out.flush(); 
     System.out.println("AuthData sent."); 
     connection.close(); 
     System.out.println("Authorization complete."); 
     connection = providerSocket.accept(); 
     System.out.println("TEST"); 
     RequestProcessor c = new RequestProcessor(connection, connectionCounter++); 
     Thread t = new Thread(c); 
     t.start(); 

    } else { 
     RequestProcessor c = new RequestProcessor(connection, connectionCounter++); 
     Thread t = new Thread(c); 
     t.start(); 
    } 
} 

あなたはきっと、私が代わりに「\ 0」の末尾には「\ U0000」を使用していていることがわかりますが、私もそのような場合をテストし、心配しないで、のdidn何も変えない。 :/

私は新しい接続を取得しないため、私は "テスト"にも達しません。そして、自分で接続を閉じることができない場合、フラッシュは自動的に私の接続を切断します。

私が最後に試したのは、何のリクエストもせずにxmlを送信することでした(接続が確立された後、最初は正しい)。私は "recvが失敗しました" - そのエラー。

PS:のRequestProcessorは...私を助けるため

おかげで、私はmy.swf-ファイルから送信された文字列/コマンドを処理している私の新しいスレッド、です! :)

答えて

0

これまではこの問題がありました。ポリシーファイル要求文字列を取得するためにin.readLine()を使用することはできません。なぜなら、ゼロ文字があるからです。 あなたが全体のポリシーファイルの読み出し要求を確認するために:

private String read(BufferedReader in) throws IOException { 
    StringBuilder builder = new StringBuilder(); 
    int codePoint; 
    boolean zeroByteRead = false; 

    System.out.println("Reading..."); 
    do { 
     codePoint = in.read(); 
     if (codePoint == -1) { 
      return null; 
     } 
     if (codePoint == 0) { 
      zeroByteRead = true; 
     } else { 
      builder.appendCodePoint(codePoint); 
     } 
    } while (!zeroByteRead); 
    return builder.toString(); 
} 

を呼び出しメソッドで:

BufferedReader in = new BufferedReader(new InputStreamReader(
        clientSocket.getInputStream())); 

String inputLine; 

while ((inputLine = read(in)) != null) { 
    System.out.println("Receive from client: " + inputLine); 
    if ("<policy-file-request/>".equals(inputLine)) { 
     // Serve policy file, like the one in your question. 
     out.println(buildPolicy() +"\u0000"); 
    } else { 
     // Do your job. 
    } 
} 

あなたがダウンロードすることができthe policy file project in javaを見つけることができます。私はそこにいる人に感謝します。

関連する問題