Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Данные от сервера (Client/Server) (http://www.flasher.ru/forum/showthread.php?t=212600)

cazzo 23.03.2016 17:58

Данные от сервера (Client/Server)
 
Здравствуйте,
Есть два класса: Main и CustomSocket. В классе Main создается кнопка, нажав на которую отсылается запрос к серверу и получаются от него данные. Как мне эти данные заполучить в классе Main, чтобы их можно было обработать или изменить.

CustomSocket.as
Код AS3:

package {
 
import flash.errors.*;
import flash.events.*;
import flash.net.Socket;
 
public class CustomSocket extends Socket {
        public var response:String;
 
        public function CustomSocket(host:String = null, port:uint = 0) {
                super();
                configureListeners();
                if (host && port)  {
                        super.connect(host, port);
                }
        }
 
        private function configureListeners():void {
                addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
                addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
                addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
        }
 
        public function readResponse():String {
                var str:String = readUTFBytes(bytesAvailable);
                response += str;
                return response;
        }
 
 
 
        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();
        }
}
}

Main.as
Код AS3:

package  {
        import flash.display.SimpleButton;
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.events.ProgressEvent;
 
        public class Main extends Sprite {
 
                private var socket:CustomSocket;
                private var d:String;
                public function Main() {
 
                        var up:Sprite = new Sprite();                       
                        up.graphics.lineStyle(1, 0x000000);
                        up.graphics.beginFill(0xCCFF00);
                        up.graphics.drawRect(0,0,50,20);
 
                        var over:Sprite = new Sprite();
                        over.graphics.lineStyle(1, 0x000000);
                        over.graphics.beginFill(0x00CCFF);
                        over.graphics.drawRect(0,0,50,20);
 
                        //create button
                        var button:SimpleButton = new SimpleButton(up,over,over,up);
                        addChild(button);
                        button.addEventListener(MouseEvent.CLICK, sata);
                }
 
                private function sata(event:MouseEvent):void
                {
                        socket = new CustomSocket("127.0.0.1", 9999);
                        socket.flush();
 
                }
 
        }
}

Спасибо.

gloomyBrain 23.03.2016 19:51

У меня есть замечания к Вашему коду.

Первое:
Я бы использовал композицию, а не наследование. То есть CustomSocket должен иметь в себе ссылку на обычный флешовый Socket, а не наследоваться от него. Как правило, композиция позволяет решать те же задачи проще.

Второе:
CustomSocket никак не уведомляет никого о том, что получил данные. Попробуйте отправлять из него событие о получении данных (например, из метода readResponse).Ну и, соответственно, в Main нужно на это событие подписаться

Третье:
Сделайте приватную переменную в Main и записывайте в нее ссылку на CustomSocket после его создания. Не создавайте новый CustomSocket при каждом клике, не думаю что Вам это на самом деле нужно.

Четвертое:
Негоже осуществлять соединение с сервером в конструкторе CustomSocket. Вынесите это в отдельный публичный метод и вызывайте из Main. Так в Main у Вас будет больше контроля над происходящим.

Ну и последнее:
Вы вызываете flush(), однако нигде в приведенном коде я не вижу отправки (write) чего либо в сокет. Скорее всего, сервер ожидает каких-то данных, чтобы ответить клиенту, а клиент этих данных не шлет.

dimarik 26.03.2016 01:01

Цитата:

Сообщение от gloomyBrain (Сообщение 1192888)
Я бы использовал композицию, а не наследование. То есть CustomSocket должен иметь в себе ссылку на обычный флешовый Socket, а не наследоваться от него.

А мне понравилось. Не каждый новичок начинает сразу экстендить нативные классы.
Но в данном случае нет прямых показаний на наследование.


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

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