Уже второй день не могу разобраться в их работе. Если запускать в самом IDE (не в браузере и не на сайте), то работает отлично, если запускать в браузере, то флешка запрашивает <policy-file-request/> , на что я ей отдаю отличный полиси файл разрешающий всё что угодно:

Код:
<?xml version="1.0" ?><cross-domain-policy><site-control permitted-cross-domain-policies="all"/><allow-http-request-headers-from domain="*" headers="*" secure="false"/><allow-access-from domain="*" to-ports="*" secure="false"/></cross-domain-policy>
после получения этого файла флешка тут же отключается! И дальше происходит нечто очень странное, первый же запрос флешки следующий после коонекта, это данные об игроке, они вообще не отсылаются, потому что в этот момент нет соеденения по сокету, однако спустя скажем секунду, когда персонаж начинает двигаться по полю и отсылать данные о координатах, то эти запросы шлются! и автоматом создаётся новый коннект к серверу (с новым resource id). Что за бред? Как можно добиться нормального коннекта до начала общения клиента с сервером?
Вот тут код флешки:

Код AS3:
package
{
[SWF(width = "807", height = "730", frameRate = "24", backgroundColor = "#FFFFFF")]
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.system.Security;
import flash.net.Socket
import flash.events.*;
import flash.text.*;
import flash.utils.Timer;
//VK API AND GUI
import vk.*;
import vk.gui.*;
import vk.api.serialization.json.*;
/**
* ...
* @author Zerg
*/
[Frame(factoryClass="Preloader")]
public class Main extends Sprite
{
public var tf: TextField;//тестовое поле для отладки
public var socket:Socket;//сокет для соеденения
public var socket_adress:String = "_здесь_был_ip_сервера_";
public var socket_port:int = 33777;
public var current_player:Object;//массив с данными текущего пользователя
public var player_obj:player_canva;//текущий пользователь
public var players:Array = [];//массив со всеми подключёнными юзерами
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
//ебанутые настройки безопасности
//Security.allowDomain("*");
Security.loadPolicyFile("xmlsocket://_здесь_был_ip_сервера_:33777");
//натсроим сокет, подключение чуть ниже после получения профиля вконтакте, в функции get_user_info()
socket = new Socket();
socket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData);
socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
socket.addEventListener(Event.CONNECT, connectHandler);
//поле для отладки
tf = new TextField();
tf.x = 10;
tf.y = 50;
tf.width = 587;
tf.height = 349;
tf.border = true;
tf.borderColor = 0xDAE2E8;
tf.background = true;
tf.backgroundColor = 0xFFFFFF;
tf.embedFonts = false;
var format:TextFormat = new TextFormat();
format.font = "Tahoma";
format.color = 0x000000;
format.size = 11;
tf.defaultTextFormat = format;
addChild(tf);
tf.appendText("Application initialized\n");
//достанем параметры встраивания
var flashVars: Object = stage.loaderInfo.parameters as Object;
//если они есть выведем в отладку
if (flashVars.api_id) {
tf.appendText("\n// -- Your code for local testing:\n");
tf.appendText("flashVars['api_id'] = " + flashVars['api_id'] + ";\n");
tf.appendText("flashVars['viewer_id'] = " + flashVars['viewer_id'] + ";\n");
tf.appendText("flashVars['sid'] = \"" + flashVars['sid'] + "\";\n");
tf.appendText("flashVars['secret'] = \"" + flashVars['secret'] + "\";\n");
tf.appendText("// -- //\n\n");
}
//фальш инициализация для тестирования
if (!flashVars.api_id) {
// -- For local testing enter you test-code here:
flashVars['api_id'] = _тут_был_номер_;
flashVars['viewer_id'] = _тут_был_номер_;
flashVars['sid'] = "c523306d9e58c74f12d19de54bc9f02ea19b1a8dd4437c32cb538f31991d7e6a9fff21427b4c65317528d";
flashVars['secret'] = "f728fbc2d6";
// -- /*/
}
//инициализация vk api
var VK:APIConnection = new APIConnection(flashVars);
//получим профиль текущего юзера
VK.api('users.get', { uids: flashVars['viewer_id'], fields: "photo" }, get_user_info, api_fail);
}
public function connect_to_server():void {
this.socket.connect(this.socket_adress, this.socket_port);
}
private function connectHandler(event:Event):void {
//посылаем сигнал о подключении к игре
join_game();
tf.appendText("подключаемся\n\n");
}
private function securityErrorHandler(event:SecurityErrorEvent):void {
tf.appendText(event.text+"\n\n");
}
/**
* Отправляет данные в сокет, параметр это Object, массив с командой и данными
* @param data
*/
private function send_to_socket(data:Object):void {
//пишем в сокет в виде сериализованного json
socket.writeUTFBytes(JSON.encode(data));
//отправка всего что записано в сокет
socket.flush();
}
/**
* Создаёт массив, с обязательым элементом act, для формирования пакета команда+данные
* @param act
* @param vk_id
* @return
*/
private function command(act:String, uid:String):Object {
var json_data:Object = new Object();
json_data.act = act;
json_data.uid = uid;
return json_data;
}
/**
* Выполняет подключение к серверу, вход в игру
*/
public function join_game():void {
var command:Object = this.command('join_game', current_player.uid);
command.photo = current_player.photo;
command.first_name = current_player.first_name;
command.x = player_obj.x;
command.y = player_obj.y;
//отправим данные
this.send_to_socket(command);
}
/**
* Отправляет обновлённые данные о текущем состоянии игрока, координаты и прочее
*/
public function send_update_state():void {
var command:Object = this.command('update_state', current_player.uid);
command.x = this.player_obj.x;
command.y = this.player_obj.y;
//отправим данные
this.send_to_socket(command);
}
/**
* обновляет состояние игрока указанного
* @param data
*/
private function update_state(data:Object):void {
//tf.appendText("Новое состояние: "+data.uid+", x = "+data.x+", y = "+data.y+"\n\n");
//если он не текущий игрок
if (data.uid != current_player.uid) {
//найдём этого игрока
for each( var player_item:player_canva in this.players) {
//если наш клиент
if (player_item.uid == data.uid) {
//обновим данные
player_item.x = data.x;
player_item.y = data.y;
}
}
}
}
/**
* добавляет в комнату нового игрока, размещает его на поле
* @param data
*/
private function add_player(data:Object):void {
//добавим его в массив игроков, если он не текущий игрок
if (data.uid != current_player.uid) {
//добавим в массив игроков
this.players.push(data);
//разместим юзера на сцене
var new_player:player_canva = new player_canva();
new_player.draw_sprite = new sprite_player() as MovieClip;
new_player.avatar_url = data.data.photo;
new_player.first_name = data.data.first_name;
new_player.x = 100;
new_player.y = 100;
new_player.main = this;
new_player.is_current = false;//этот юзер не текущий им нельзя управлять
new_player.uid = data.uid;
addChild(new_player);
}
}
private function ioErrorHandler(event:IOErrorEvent):void {
tf.appendText(event.text+"\n\n");
}
private function onSocketData(event:ProgressEvent):void { //tf.appendText(socket.readUTFBytes(socket.bytesAvailable)+"\n\n");
//декодируем в объект
var json_data:Object = JSON.decode(socket.readUTFBytes(socket.bytesAvailable));
//если ошибка
if (json_data.act == 'error') {
tf.appendText(json_data.text+"\n\n");
}
//вход в игру выполнен
if (json_data.act == 'join_game') {
tf.appendText(json_data.text+"\n\n");
}
//показать нового игрока в комнате
if (json_data.act == 'add_player') {
tf.appendText(json_data.text + "\n\n");
//создадим нового игрока
this.add_player(json_data);
}
//у когото изменились данные
if (json_data.act == 'update_state') {
//обновим данные об игроке этом
this.update_state(json_data);
}
//очистка сокета
socket.flush();
}
private function get_user_info(data: Object): void {
var profile:* = data[0];//профиль пользователя, uid, first_name, last_name, photo (small)
//запишем данные
current_player = profile;
//разместим юзера на сцене
player_obj = new player_canva();
player_obj.draw_sprite = new sprite_player() as MovieClip;
player_obj.avatar_url = profile.photo;
player_obj.first_name = profile.first_name;
player_obj.x = 100;
player_obj.y = 100;
player_obj.main = this;
//добавим на сцену
addChild(player_obj);
//подключаемся
connect_to_server();
}
private function api_fail(data: Object): void {
var error_msg:String = "";
if (data is String) {
error_msg = data.toString();
}else {
error_msg = data.error_msg;
}
var box:Box = new Box( "Ошибка", "Ошибка в работе VK API дальнейшая работа невозможна! Информация: "+error_msg, 90, 500, [] );
addChild( box );
box.visible = true;
}
private function show_box(title: String, text: String): void {
var box:Box = new Box( title, text, 90, 500, [] );
addChild( box );
box.visible = true;
}
}
}
может у меня последовательность какая-то не такая? Весь гугл перерыл, нормальных примеров нет, исходников не нашёл.