Java <-> Flash Socket - проблема с файлом политики - PullRequest
0 голосов
/ 22 декабря 2011

Я знаю, что есть много людей, которые уже задавали этот вопрос, но во всех темах, которые я прочитал, я не мог найти одно решение для моей проблемы (даже если у других была такая же проблема, она не работала для меня).

Как сказано в заголовке, я пытаюсь подключиться из Flash / SWF-приложения к небольшому Java-серверу, который я написал через Sockets. Он отлично работает в автономном режиме (на той же машине), но как только я помещаю .swf в веб-пространство и открываю его оттуда, 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();
    }
}

Вы наверняка заметите, что я использую «\ u0000» в конце вместо «\ 0», но не волнуйтесь, я также проверял этот случай, ничего не изменил. : /

Я даже не дошёл до «ТЕСТА», потому что у меня нет нового соединения. И если я сам не закрою соединение, flash автоматически отключит меня.

Последнее, что я попробовал, было просто отправить xml без какого-либо запроса (в самом начале, после установления соединения). Я получил «recv failed» - ошибка для этого.

PS: RequestProcessor - это мой новый поток, в котором я буду обрабатывать строки / команды, отправленные из my.swf-файла ...

Спасибо за помощь! :)

1 Ответ

0 голосов
/ 12 октября 2012

У меня была эта проблема раньше, вы не можете просто использовать 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.
    }
}

Вы можете найти проект файла политики в java , которыйможно скачать.Я сам благодарю ребят там.

...