PDA

Просмотр полной версии : Flash сокеты


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

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

Вот код класса для работы с сокетами (в порядок не приводил):
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 кадре (и последнем) пишу код для создания экземпляра и работы с сокетом.

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 раза открывать соединение? Почему первое соединение не закрываете?
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
Вот здесь у вас уже произошло соединение.
private function Connected(event:Event):void {
trace("Успешное соединение! ");
}

Добавлено через 4 минуты
может быть еще можно где-нибудь размещать?
В классах. Классы описываются в файлах с расширением as. Раз вы программировали на C# и Java, такой подход не будет вам в новинку.
Если вы не аниматор, то использовать Flash Professional (Flash IDE) вам смыла особого нет, можете подобрать себе нормальную IDE из этого списка (http://www.flasher.ru/forum/showthread.php?t=161639) (список не полный, но там перечислены наиболее популярные IDE).

Genzo
25.01.2012, 14:35
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
и вроде надо листенер вешать до того как вызываете метод connect
Не обязательно, это асинхронная операция, соединение будет установлено, в любом случае, после того как отработает функция в которой был вызван connect.

TrueTrAxeX
25.01.2012, 14:57
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()