Flex3. Сокетные соединения (Socket connections) Часть 2

    Продолжение перевода Socket Connections Часть 1

    • XMLSocket.connect () может подключаться только к тем компьютерам которые расположены в том же домене, где и находится сам SWF файл. Это ограничение не применяется для SWF файлов запущенных с локального диска. (Это ограничение является идентичным правилам безопасности для URLLoader.load ().) Для подключения к серверному демону выполняющемся в другом домене, отличного от того где находится SWF, на сервере можно создать файл политики безопасности в котором можно прописать разрешение на получение доступа из другого домена.

    Примечание: Настройка сервера для работы с объектом XMLSocket может оказаться весьма непростым занятием. Поэтому, если ваше приложение не требует взаимодействия в реальном времени, используйте класс URLLoader вместо класса XMLSocket.

    Вы можете использовать методы XMLSocket.connect() и XMLSocket.send() класса XMLSocket для передачи данных XML на сервер через сокет-соединение. Метод XMLSocket.connect() устанавливает соединение с портом веб-сервера. Метод XMLSocket.send() отсылает XML объект на сервер с помощью установленного сокет-соединения.

    Когда вызывается метод XMLSocket.connect(), Flash Player открывает TCP/IP соединение с сервером и сохраняет его открытым до тех пор, пока не произойlёт одно из следующих событий:
    • Вызван метод XMLSocket.close() класса XMLSocket.
    • Больше нет ссылки на существующий объект XMLSocket.
    • Завершение работы Flash Player'а
    • Разрыв соединения (например, отсоединение модема).

    Создание Java XML Socket сервера и подключение к нему


    Следующий код демонстрирует простой XML Socket сервер написанный на Java, принимающий входящие соединения и отображает принятые сообщения в окне командной строки. По умолчанию новый сервер создается на 8080 порту вашего компьютера, хотя вы можете указать и другой номер порта, при запуске сервера из командной строки.

    Создайте новый текстовый документ и добавьте в него следующий код:

    import java.io.*;
    import java.net.*;
    class SimpleServer{
        private static SimpleServer server;
        ServerSocket socket;
        Socket incoming;
        BufferedReader readerIn;
        PrintStream printOut;
        public static void main(String[] args){
            int port = 8080;
            try{
                port = Integer.parseInt(args[0]);
            } catch (ArrayIndexOutOfBoundsException e) {
                // Catch exception and keep going.
            }
            server = new SimpleServer(port);
        }
    
        private SimpleServer(int port) {
            System.out.println(">> Starting SimpleServer");
            try{
                socket = new ServerSocket(port);
                incoming = socket.accept();
                readerIn = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
                printOut = new PrintStream(incoming.getOutputStream());
                printOut.println("Enter EXIT to exit.\r");
                out("Enter EXIT to exit.\r");
                boolean done = false;
                while (!done){
                    String str = readerIn.readLine();
                    if (str == null){
                        done = true;
                    }else{
                        out("Echo: " + str + "\r");
                        if(str.trim().equals("EXIT")){
                            done = true;
                        }
                    }
                    incoming.close();
                }
            }
            catch (Exception e){
                System.out.println(e);
            }
        }
        private void out(String str){
            printOut.println(str);
            System.out.println(str);
        }
    }
    


    Сохраните документ на диске ка SimpleServer.java и скомпилируйте используя Java компилятор, который создаст Java файл с именем SimpleServer.class Вы можете запустить XML сокет сервер открыв командную строку и набрав java SimpleServer. Файл SimpleServer.class может быть расположен в любом месте вашего компьютера или в сети; совершенно не обязательно его располагать его в корневой директории вашего веб-сервера.

    Если вам не удаётся запустить сервер из-за того, что не найден путь к Java классу, попробуйте так java -classpath. SimpleServer. (Мои познания в Java не столь глубоки, так что если я некорректно сформулировал перевод данного абзаца прошу меня поправить)

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

    var xmlsock:XMLSocket = new XMLSocket();
    xmlsock.connect("127.0.0.1", 8080);


    Событие securityError (flash.events.SecurityErrorEvent) может возникнуть, если происходит вызов XMLSocket.connect() и происходит попытка соединится с сервером находящимся за пределами песочницы безопасности или если номер указанного порта меньше 1024.

    Всякий раз при получении данных от сервера срабатывает событие DATA (flash.events.DataEvent.DATA):

    xmlsock.addEventListener(DataEvent.DATA, onData);
    private function onData(event:DataEvent):void{
        trace("[" + event.type + "] " + event.data);
    }
    


    Отправить данные XMLSocket серверу можно используется метод XMLSocket.send() с передачей в качестве параметра XML объекта или строки. Flash Player преобразует указанный параметр в объект типа String, и передает содержимое, XMLSocket серверу, добавляя в конце нулевой (0) байт.

    xmlsock.send(xmlFormattedData);

    Метод XMLSocket.send() не возвращает какое либо значение подтверждающее, что данные переданы успешно. Если при передаче происходит ошибка, то выбрасывается исключение типа IOError.

    Каждое отправленное XML сообщение сокет-сервером должно завершаться символом начала новой строки (\n)

    Заранее благодарю за ваши конструктивные комментарии, и искренне надеюсь, что этот перевод будет кому-то полезен и поможет решить поставленные задачи.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 6

      0
      Каждое отправленное XML сообщение сокет-сервером должно завершаться символом начала новой строки (\n)


      Кто Вам это сказал? XMLSocket использует для разделения сообщений нулевой байт и не нуждается в переводах строки, собственно сокеты вобще ни в чем не нуждаются. Просто некоторые протоколы используют тот или иной формат передачи данных для разделения сообщений, в частности некоторые используют символ перевода строки (например Telnet), но не в данном случае.
        0
        Each message you send to the XML socket server must be terminated by a newline (\n) character.
        Да, Думаю слово «Должно» слишком громко сказано :) Спасибо за комментарий.
          0
          перевод верный, только пожалуй адобы сами себя перехитрили в этом нотисе по поводу работы с XMLSocket, потому как он(XMLSocket) вовсе не требует этого и прекрасно без него обходиться.
            0
            Вот кстати

            Livedocs Flex 3

            followed by a zero (0) byte

            в предпоследнем абзаце они все верно указали, что сообщение преобразовывается в строку и затем завершается нулевым байтом

            в двойне непонятно, при чем тут (следующий через пару строк) нотис про перевод строки, возможно они просто описа'лись ))

          0
          плохая у вас программа на жабе. негодная, непонятная
          dpaste.org/dT7N/raw/
            0
            программу не я писал, это программа предложенная в официальной документации по flex 3, спасибо за предложенную альтернативную версию

          Only users with full accounts can post comments. Log in, please.