Java< - > Flash套接字 - 策略文件问题

时间:2011-12-22 13:37:52

标签: java flash file sockets policy

我知道有很多人已经问过这个问题,但在我读过的所有帖子中,我找不到解决问题的方法(即使其他人有同样的问题,但对我来说也不行)。

正如标题所说,我正在尝试从Flash / SWF-Application连接到我通过套接字编写的小型Java服务器。它可以脱机工作(在同一台机器上),但只要将.swf放在Webspace上并从那里打开它,Flash就会从服务器请求Policy文件。这没有什么不好,但我的问题是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();
    }
}

你肯定会注意到我在结尾使用“\ u0000”而不是“\ 0”,但不要担心,我也测试了这个案例,没有改变任何东西。 :/

我甚至没有达到“TEST” - 输出,因为我没有得到新的连接。如果我自己不关闭连接,闪光灯会自动断开连接。

我尝试的最后一件事就是在没有任何请求的情况下发送xml(在建立连接之后就开始了)。我得到了“recv failed” - 错误。

PS:RequestProcessor是我的新线程,在其中我将处理从my.swf-File发送的字符串/命令......

谢谢你的帮助! :)

1 个答案:

答案 0 :(得分: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。我自己也感谢那边的那些人。