Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   socket: чтение сообщений с сервера (http://www.flasher.ru/forum/showthread.php?t=110992)

Ноябрь 13.04.2008 21:45

socket: чтение сообщений с сервера
 
написал я наконец свой первый сервер:) И теперь хочу повесить на него флэшку..
код из хелпа:
Код:

package main{
    import flash.display.Sprite;

    public class Index extends Sprite {

        public function Index() {
            var socket:CustomSocket = new CustomSocket("localhost", 31337);
        }
    }
}

import flash.errors.*;
import flash.events.*;
import flash.net.Socket;

class CustomSocket extends Socket {
    private var response:String;

    public function CustomSocket(host:String = null, port:uint = 0) {
        super(host, port);
        configureListeners();
    }

    private function configureListeners():void {
        addEventListener(Event.CLOSE, closeHandler);
        addEventListener(Event.CONNECT, connectHandler);
        addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
        addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
        addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
    }

    private function writeln(str:String):void {
        str += "\n";
        try {
            writeUTFBytes(str);
        }
        catch(e:IOError) {
            trace(e);
        }
    }

    private function sendRequest():void {
        trace("sendRequest");
        response = "";
        writeln("hello :)");
        flush();
    }

    private function readResponse():void {
        var str:String = readUTFBytes(bytesAvailable);
        response += str;
    }

    private function closeHandler(event:Event):void {
        trace("closeHandler: " + event);
        trace(response.toString());
    }

    private function connectHandler(event:Event):void {
        trace("connectHandler: " + event);
        sendRequest();
    }

    private function ioErrorHandler(event:IOErrorEvent):void {
        trace("ioErrorHandler: " + event);
    }

    private function securityErrorHandler(event:SecurityErrorEvent):void {
        trace("securityErrorHandler: " + event);
    }

    private function socketDataHandler(event:ProgressEvent):void {
        trace("socketDataHandler: " + event);
        readResponse();
    }
}

Сервер выводит две строки, приветственную и при выполнении команды.
Данный код ведет себя довольно странно: при первом подключении ничего не пишет и остается ждать ответа от сервера, при последующих подключениях выводит приветственное сообщение и отключается. Команда в обоих случаях выполняется.
Мне же надо, чтобы сокет считывал обе строки и оставался ждать ответа от сервера.

Iv 14.04.2008 14:14

Твой сокет может убиваться сборщиком мусора.
Попробуй локальную переменную socket заменить на переменную класса.

vapes 14.04.2008 20:07

Доброго все мвремени суток, может кто-нибудь поможет мне разобраться с секьюрити для сокет соединения и обновлением для флеш плеера 9,0,155?
Из того, что я знаю:
существует 2 вида кроссдоменной хмл :
1- для загрузки флешек, картинок, музыки
2- для общения с сервером по сокетах (о чем и пойдет далее речь)
SWF файл я выложил у себя на апаче http://localhost/drag.swf
При попытке флешки присоединится к моему ява серверу (localhost,6666) флеш плеер сначала требует кроссдомеину на портах 6666 и 843 ,что сервер ему с радостью и отдает
Код:

  if (str.contains("policy-file-request")) {
            System.out.println("cross domain request was accepted. i will send u crossdomain.xml.");
            sendToSocket("<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"6666\" /></cross-domain-policy>\0", null);
            return;
        }

но флеш плеер выводит в лог, что ничего не получил :(
Код:

Warning: Timeout on xmlsocket://localhost:843 (at 3 seconds) while waiting for socket policy file.  This should not cause any problems, but see http://www.adobe.com/go/strict_policy_files for an explanation.
Warning: Timeout on xmlsocket://localhost:6666 (at 3 seconds) while waiting for socket policy file.  This should not cause any problems, but see http://www.adobe.com/go/strict_policy_files for an explanation.
Error: SWF from http://localhost/drag.swf may not connect to a socket in its own domain without a policy file.  See http://www.adobe.com/go/strict_policy_files to fix this problem.
*** Security Sandbox Violation ***
securityErrorHandler: [SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048: Security sandbox violation: http://localhost/drag.swf cannot load data from localhost:6666."]

Подскажите пожалуйсто, что не так. Заранее спасибо.

etc 14.04.2008 23:22

А loadPolicyFile вызывается?

Ноябрь 14.04.2008 23:23

может лучше отдельную тему создать, тут речь идет не об хмл сокетах..

Все дело было в сервере. Что бы флэш прочитал строку она должна оканчиваться \r, а у меня заканчивалась \n.. не зря в примере, в конце стоит \r\n..(но я подумал нафиг надо.. первоначальный клиент работал и без \r).
вопрос: что делает метод flush()?
Цитата:

Flushes any accumulated data in the socket's output buffer.
не могу понять что это значит..

kononencheg 15.04.2008 01:02

О! кстати схожая проблема и столкнулся сегодня. :)
SecurityError в любом (!) случае вызывается для всех портов кроме 80 (на который нельзя создать сокет сервер) из браузера.
Флешка отдельно прекрасно соединяется с сервером.
Ну конечно с учетом кроссдомейна.хмл

А еще тонкий момент - флешка ДОЛЖНА лежать в директории локалхоста! В под-папках даже отдельно флеха не пашет.

kononencheg 15.04.2008 01:10

Извините за оффтопик.
2 Ноябрь:
Твой сервак тоже жрет почти всю процессорную память?

Ноябрь 15.04.2008 03:12

нет.. абсолютно не загружает..
сервак на руби, 2 клиента на руби, 3 флэшки (типа чат) совершенно не загружают проц (я вообще полагаю в том и прикол, что не нагружает проц, в отличии от рефрешей..).
У меня другая проблема - не могу обновить массив клиентов после отключения одного из них, но, надеюсь скоро разберусь..
а потом пойму и что такое flush()..:)

vapes 15.04.2008 12:09

Цитата:

Сообщение от __etc
А loadPolicyFile вызывается?

Насколько я знаю, то можно и без него, но на всякий случай я сделал так:
Код:

        socket = new XMLSocket();
        configureListeners(socket);
        Security.loadPolicyFile("xmlsocket:localhost:6666");
        socket.connect(hostName, port);

гружу его по xml сокету, правда не знаю, можно ли локально

etc 15.04.2008 12:59

Цитата:

Сообщение от vapes
Код:

Security.loadPolicyFile("xmlsocket:localhost:6666");

Где вы в документации видели такой url?

vapes 15.04.2008 14:49

Using the xmlsocket protocol along with a specific port number, lets you retrieve policy files directly from an XMLSocket server, as shown in the following example:

Security.loadPolicyFile("xmlsocket://foo.com:414");

Эмм щас попробую 2 слэша поставить. - не помогло ,или я всеравно чето не так делаю?
Security.loadPolicyFile("xmlsocket://localhost:6666");
Также попробовал грузить файл локально
Security.loadPolicyFile("http://localhost/crossdomain.xml");
и вот что выдал лог:
Код:

OK: Root-level SWF loaded: http://localhost/drag.swf
OK: Searching for <allow-access-from> in policy files to authorize data loading from resource at xmlsocket://localhost:6666 by requestor from http://localhost/drag.swf
OK: Policy file accepted: http://localhost/crossdomain.xml
Warning: Timeout on xmlsocket://localhost:843 (at 3 seconds) while waiting for socket policy file.  This should not cause any problems, but see http://www.adobe.com/go/strict_policy_files for an explanation.
Warning: Timeout on xmlsocket://localhost:6666 (at 3 seconds) while waiting for socket policy file.  This should not cause any problems, but see http://www.adobe.com/go/strict_policy_files for an explanation.
Error: SWF from http://localhost/drag.swf may not connect to a socket in its own domain without a policy file.  See http://www.adobe.com/go/strict_policy_files to fix this problem.

Насколько я помню то теперь если соединение идет по сокету, то и кроссдомеина должна прити по сокету.

kononencheg 15.04.2008 15:39

А вы в чем дебажите?

vapes 15.04.2008 17:46

Цитата:

Сообщение от kononencheg
А вы в чем дебажите?

адоб флеш плеером (дебаг версии) с дополнительным дебагом для секьюрити.
И активировать его можно так:
заходим в C:\Documents and Settings\(user name)\
открываем mm.cfg (если нет - создаем) и дописываем там:

PolicyFileLog=1 # Enables policy file logging
PolicyFileLogAppend=1 # Optional; do not clear log at startup

закрываем и загружаем флешку. После этого у нас появляется дополнительный файл policyfiles.txt , находящийся в
C:\Documents and Settings\(user name)\Application Data\Macromedia\Flash Player\Logs\
там и будет рассказано кто , что и откуда загружал и удалось ли это ему.
А на сайте адоба есть еще расшифровка комментов - аппендицит В (appendixB) http://www.adobe.com/devnet/flashpla...curity_07.html
но я бы лучше назвал это гемороем...

kononencheg 15.04.2008 18:49

Угу, это я знаю, я имею ввиду во флексе или во флеше?

vapes 15.04.2008 18:53

Во флеше

kononencheg 16.04.2008 00:17

Понятно...
Слушайте, попробуйте запустить флешку с сокетным соединением к локальному серверу из хтмл страницы. Просто интересно у меня ли только такой глюк защиты.

И кстати flush - это функция очиски буфера забитого даннымидля передачи, ну и собственно передача.

vapes 16.04.2008 14:07

Все ,разобрался.
Читать здесь: http://vapes.na.by/blog/index.php?en...y080416-120458

Iv 16.04.2008 14:14

Да... Тебе в бложике спелл чекера явно не хватает. Грамматические ошибки существенно снижают степень доверия к автору.

kononencheg 17.04.2008 01:09

2 vapes:
Не понял к чему ты это :)

Ты наверное не понял в чем проблемы возникают.
При нормально работающей политике безопасности в FlashPlayer'е она не работает в плагине и в ActiveX элементе браузеров. :)

А ты вопщем молодец, что разобрался :)

Ноябрь 17.04.2008 02:37

флэшка коннектиться к серверу.
http://www.macromedia.com/support/do...manager04.html
здесь добавлена директория откуда я все запускаю, соответственно в ней (и во вложенных) работает, за ее пределами нет. Теперь выгружаю на сайт, записываю адрес сайта в разрешенные директории, и почему-то не работает..

kononencheg 17.04.2008 02:50

2 vapes:
Не понял к чему ты это :)

Ты наверное не понял в чем проблемы возникают.
При нормально работающей политике безопасности в FlashPlayer'е она не работает в плагине и в ActiveX элементе браузеров. :)

А ты вопщем молодец, что разобрался :)


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

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