Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   И вновь о сокетах и политике безопасности (http://www.flasher.ru/forum/showthread.php?t=115251)

VovkaMorkovka 24.08.2008 15:57

И вновь о сокетах и политике безопасности
 
Всем привет, пытаюсь достучаться до сокета из локально запущенной флешки, для этого использую вот такой код на java со стороны сервера и AS 3.0 со стороны клиента

java

Код:

package org.editor.sockets;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public final class SocketServer {
        private static final int PORT = 8080;
        private static ServerSocket SERVER_SOCKET = null;
        private static SocketServer INSTANCE = null;
        private static String CROSSDOMAIN_XML = "<cross-domain-policy>"
                        + "<allow-access-from domain=\"*\" to-ports=\"" + PORT + "\"/>" +

                        "</cross-domain-policy>";
        Runnable _socketListenerProcessor;

        public static SocketServer getInstance() {
                if (INSTANCE == null) {
                        INSTANCE = new SocketServer();

                }
                return INSTANCE;
        }

        /**
        * Init server socket.
        *
        * @author vovkamorkovka
        */
        private boolean initServer() {
                try {
                        SERVER_SOCKET = new ServerSocket(PORT);
                       
                        return true;
                } catch (IOException e) {

                        e.printStackTrace();
                        return false;
                }
        }

        private SocketServer() {
                initServer();

                _socketListenerProcessor = new Runnable() {

                        @Override
                        public void run() {
                                try {

                                        // Блокирует до тех пор, пока не возникнет соединение:

                                        Socket clientSocket = SERVER_SOCKET.accept();
                                        // Вывод автоматически выталкивается из буфера
                                        // PrintWriter'ом
                                        System.out.println("accept socket");
                                        PrintWriter out =

                                        new PrintWriter(

                                        new BufferedWriter(

                                        new OutputStreamWriter(

                                        clientSocket.getOutputStream())), true);
                                       

                                        //System.out.println("accept socket:" + CROSSDOMAIN_XML);
                                        try {

                                                System.out.println(

                                                "Connection accepted: " + clientSocket);

                                                BufferedReader in =

                                                new BufferedReader(

                                                new InputStreamReader(

                                                clientSocket.getInputStream()));

                                                // Вывод автоматически выталкивается из буфера
                                                // PrintWriter'ом

                                                while (true) {

                                                        String str = in.readLine();
                                                        if (str.contains("policy-file-request")) {
                                                                out.println(CROSSDOMAIN_XML+"\r\n");
                                                                out.flush();
                                                                System.out.println("try to load policy");
                                                               
                                                        } else {
                                                                if (str.equals("END"))
                                                                        break;

                                                                System.out.println("Echoing: " + str);

                                                                out.println(str);
                                                        }

                                                }

                                                // Всегда закрываем два сокета...

                                        } finally {

                                                System.out.println("closing...");

                                                clientSocket.close();

                                        }

                                } catch (IOException e1) {

                                } finally {

                                        try {
                                                SERVER_SOCKET.close();
                                        } catch (IOException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }

                                }

                        }

                };

                _socketListenerProcessor.run();

        }

        public static void main(String args[]) {
                SocketServer.getInstance();

                while (true) {

                }
        }

}

И AS 3.0

Код:

    package org.editor.sockets.example {
        import flash.display.SimpleButton;
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.net.XMLSocket;
        import flash.system.Security;
        import flash.text.TextField;               

        /**
        * @author vovkamorkovka
        */
        public class SocketsExample extends Sprite {
                private var _sendMessageBtn : SimpleButton = null;
                private var _connectBtn : SimpleButton = null;
                private var _socket : XMLSocket = null;
                private var _inputText : TextField;

                public function SocketsExample() {
                       
                        Security.loadPolicyFile("localhost:8080");
                        _sendMessageBtn = this["sendMessageBtn"] as SimpleButton;
                       
                        _connectBtn = this["connectBtn"] as SimpleButton;
                        _inputText = this["logText"] as TextField;
                                       
                        _sendMessageBtn.addEventListener(MouseEvent.CLICK, sendMessage);
                        _connectBtn.addEventListener(MouseEvent.CLICK, connect);
                }

                private function connect(event : MouseEvent) : void {
                        _socket = new XMLSocket();
                       
                        try {
                                _socket.connect("localhost", 8080);
                        }catch(e : Error) {
                                _inputText.appendText("connect:" + e.toString() + "\n");
                        }
                }

                private function sendMessage(event : MouseEvent) : void {
                       
                       
                        if (_socket == null) {
                                _inputText.appendText("send message, socket have not bin created\n");
                                return;
                        }
                        try {
                                _socket.send("salo salo\n");
                        }catch(e : Error) {
                                _inputText.appendText("send message," + e.toString() + "\n");
                        }
                }
        }
}

Проблема в следующем: флеш не присылает сокету запрос crossdomain.xml
Причем не присылает ни в тестовом режиме, ни в режиме локально запущенного
Вопроса как всегда два: кто виноват и что делать :)

p.s. Искал на форуме, много схожих тем, но конкретно этот вопрос не освещается

DarkLight 24.08.2008 16:45

1) Security.loadPolicyFile("xmlsocket://localhost:8080");
2) при отправке полиси файла надо писать не \r\n а нулевой байт (\0)
3) при тестировании локально нужно разрешить использование сокетов в Settings Manager на сайте адоба, т к 9ый плеер не выдает ошибки "local files are not permitted to use sockets", в отличие от 10го, а просто тупо не шлет

VovkaMorkovka 24.08.2008 16:51

Ну у меня десятый плеер стоит, поэтому ошибку такую выдает, это первое. Собственно под дебаг - режимом я и понимаю разрешение через сайт адоби.
Так как ты предложил тоже пробовал и всеравно выдает вышеуказанную ошибку.
По поводу нулевого байта в конце, ты прав конечно, но дело в том, что java - сокету НЕ ПРИХОДИТ запрос на crossdomain.xml.
Т.е. чтоб его куда - нибудь посылать сначала запрос должен быть, а его - то и нетути.

Есть какой - нибудь способ настроить программно флешку так, чтоб ей разрешалось использовать сокеты локально? Мне сокеты и нужны собственно для того, чтобы передавать даные java - части программы, т.е. флешка мне нужна именно запущенная локально

DarkLight 24.08.2008 17:10

Хм, т е флешка вообще ничего не спрашивает у сервера? А что клиент говорит? какой тип ошибки?
Плюс в приведенном коде нет проверки на то соединен ли сокет при отсылке. А по java есть вопрос - PrintWriter out разве не рискует быть собранным GC?

VovkaMorkovka 24.08.2008 17:17

Клиент молчит, на попытку законнектиться говорит ту ошибку, что ты описал выше

DarkLight 24.08.2008 17:26

Ну так значит что-то неправильно в Settings Manager прописано, и потому отказывается соединяться


Часовой пояс GMT +4, время: 10:38.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.