Форум 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?


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

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