Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Flash сокеты (http://www.flasher.ru/forum/showthread.php?t=174430)

TrueTrAxeX 25.01.2012 14:07

Flash сокеты
 
Здравствуйте, хотелось бы рассказать о своей проблеме. У меня есть Java Server (Java клиент с ним нормально работает).

Я создал клиент на FLASH и тут начались проблемы. Когда происходит соединение с сервером, возможно только первые 2-3 секунды общаться с сервером! Дальше флешка просто ничего не посылает!

Вот код класса для работы с сокетами (в порядок не приводил):
Код AS3:

package org.conn {
 
import flash.errors.*;
import flash.events.*;
import flash.net.Socket;
 
        public class CustomSocket {
 
                var CSsocket:Socket = new Socket();
 
                public function CustomSocket(host:String = null, port:uint = 0) {
                        CSsocket.timeout = 100000;
                        CSsocket.connect(host,port);
                        configureListeners();
 
                }
 
                private function configureListeners():void {
                        //socket.addEventListener(Event.CLOSE, this.closeHandler);
                        //socket.addEventListener(Event.CONNECT, this.connectHandler);
 
 
                        //socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
                        CSsocket.addEventListener(Event.CONNECT, Connected);
 
                        //socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
                }
 
                private function ErrorHandler(event:Event):void {
 
                        trace("FSDFSDF");
                }
 
                private function Connected(event:Event):void {
 
                        trace("Успешное соединение! ");
 
                }
 
                private static const _TRIM_PATTERN:RegExp = /^\s*|\s*$/g;
 
                public static function trim(text:String):String {
                        return text.replace(_TRIM_PATTERN, "");
                }
 
                public function socketWrite(Message:String)
                {
                        CSsocket.writeUTF(Message);
 
                }
 
                public function socketRead():String
                {
                        var CountBytes:int = CSsocket.bytesAvailable;
                        var Response:String = trim(CSsocket.readUTFBytes(CountBytes));
 
                        return Response;
                }
 
                private function socketDataHandler(event:ProgressEvent):String {
                        var CountBytes:int = CSsocket.bytesAvailable;
                        var Response:String = trim(CSsocket.readUTFBytes(CountBytes));
                        trace("socketDataHandler: " + Response);
 
                        return Response;
                }
 
        }
 
}

В 1 кадре (и последнем) пишу код для создания экземпляра и работы с сокетом.

Код AS3:

Security.loadPolicyFile("xmlsocket://localhost:813");
 
function Connect(event:Event):void
{
                var CSsocket:CustomSocket = new CustomSocket("localhost", 5000);
 
                CSsocket.socketRead();
                CSsocket.socketWrite("gasdg");
}


Я понимаю, что если много раз нажимаешь на кнопку, которая вызывает функцию Connect, то порт будет просто занят. Но почему когда я закрываю сокет после отправки и принятия данных, Flash выдает ошибку?

Я умею размещать начальный код для запуска всего механизма только в кадре, может быть еще можно где-нибудь размещать? (я начинающий флешер, до этого программировал на PHP, C#, Java, JS).

P.S:
Policy File работает на ура!

Genzo 25.01.2012 14:19

Зачем вам 2 раза открывать соединение? Почему первое соединение не закрываете?
Код AS3:

function Connect(event:Event):void
{
                var CSsocket:CustomSocket = new CustomSocket("localhost", 5000);
                //У вас еще не произошло еще подключение, а читать и писать вы уже начали
                CSsocket.socketRead();
                CSsocket.socketWrite("gasdg");
}


TrueTrAxeX 25.01.2012 14:21

А как дождаться момента, чтобы оно произошло? Скажите пожалуйста.

alatar 25.01.2012 14:30

Вот здесь у вас уже произошло соединение.
Код AS3:

private function Connected(event:Event):void {
        trace("Успешное соединение! ");
}

Добавлено через 4 минуты
Цитата:

может быть еще можно где-нибудь размещать?
В классах. Классы описываются в файлах с расширением as. Раз вы программировали на C# и Java, такой подход не будет вам в новинку.
Если вы не аниматор, то использовать Flash Professional (Flash IDE) вам смыла особого нет, можете подобрать себе нормальную IDE из этого списка (список не полный, но там перечислены наиболее популярные IDE).

Genzo 25.01.2012 14:35

Код AS3:

function Connect(event:Event):void
{
                var CSsocket:CustomSocket = new CustomSocket("localhost", 5000);
                //У вас еще не произошло еще подключение, а читать и писать вы уже начали
                CSsocket.addEventListener("myTestEvent" , connectSucces);
                CSsocket.connect();
}
private function connectSucces(e:Event):void
{
var CSsocket:CustomSocket = e.currentTarget as CustomSocket;
                CSsocket.socketRead();
                CSsocket.socketWrite("gasdg");
}
 
 
public class CustomSocket extends EventDispatcher{
 
private var _host:String;
private var _port:uint;
 
public function CustomSocket(host:String = null, port:uint = 0) {
this._host = host;
this._port = port;
                        CSsocket.timeout = 100000;
                        configureListeners();
 
                }
 
public function connect():void
{
CSsocket.connect(_host,_port);
}
 
 
private function Connected(event:Event):void {
 
                        trace("Успешное соединение! ");
 this.dispatchEvent(new Event("myTestEvent"));
                }
}


willis83 25.01.2012 14:43

и вроде надо листенер вешать до того как вызываете метод connect

alatar 25.01.2012 14:49

Цитата:

Сообщение от willis83 (Сообщение 1059001)
и вроде надо листенер вешать до того как вызываете метод connect

Не обязательно, это асинхронная операция, соединение будет установлено, в любом случае, после того как отработает функция в которой был вызван connect.

TrueTrAxeX 25.01.2012 14:57

Код AS3:

private function Connected(event:Event):void {
 
                        trace("Успешное соединение! ");
 
                        trace(socketRead());
 
                        socketWrite("TrAxeX");
 
 
                        trace(socketRead());
 
                        socketClose();
                }

Запихал в класс данный код. Все равно не может отослать ничего на сервер. Сервер не выводит присланный логин. Что же может быть?

Nikolay00700 25.01.2012 18:18

Для as3 посоветовал бы FlashDevelop

Времени нет сразу разобрать что вы сделали в последнем сообщении...
но код в начале темы гораздо нагляднее...

1.Вам стоило только поместить все действия с соединением (из последнего кадра), после срабатывания слушателя на подключение... и вызова слушателем функции Connected

2.loadPolicyFile следует вызывать перед коннектом...

3.CSsocket.socketWrite("gasdg"); - Здесь нужно в конце строки поставить \n...
Вот так: CSsocket.socketWrite("gasdg\n");


Думаю пункт 3 и будет решением...

alatar 25.01.2012 18:20

Цитата:

3.CSsocket.socketWrite("gasdg"); - Здесь нужно в конце строки поставить \n...
достаточно вызвать flush()


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

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