Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 14.09.2011, 18:24
Anton_sz вне форума Посмотреть профиль Отправить личное сообщение для Anton_sz Найти все сообщения от Anton_sz
  № 1  
Ответить с цитированием
Anton_sz

Регистрация: Sep 2011
Сообщений: 9
Attention sockets + apache + php

Приветствую. Недавно начал работать с as3 и не могу решить одну задачу:
Нужно из flash передать данные для php скрипта и получить от него ответ, причем сделать это нужно через socket. Причем флешка будет грузиться на одном домене, а скрипт будет находиться на другом.
Вот код as3
Код AS3:
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.TextEvent;
	import flash.net.Socket;
	import flash.text.TextField;
	import flash.text.TextFieldType;
	import flash.events.ProgressEvent;
	import flash.system.Security;
 
	public class Main extends Sprite 
	{
		private var mySocket:Socket;
		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);
			// entry point
			var field:TextField = new TextField();
			field.border = true;
			field.x = 10;
			field.y = 10;
			field.borderColor = 0xCCC;
			field.width = 780;
			field.height = 580;
			field.type = TextFieldType.DYNAMIC;
			addChild(field);
 
			mySocket = new Socket();
			mySocket.addEventListener(Event.CONNECT, onConnect);
			function onConnect(success:Event):void {
				if (success) {
					field.appendText("Server connection established!\n");
				} else {
					field.appendText("Server connection failed!");
				}
			};
 
			mySocket.addEventListener(ProgressEvent.SOCKET_DATA, onData);
			function onData(event:ProgressEvent):void {
				field.appendText(mySocket.readUTFBytes(mySocket.bytesAvailable));
			};
 
 
			Security.loadPolicyFile("socket://localhost:80");
			mySocket.connect("localhost", 80);
			var str:String;
 
			str += "GET /index.php?test=text HTTP/1.0\r\n";
			str += "Host:localhost\r\n";
			str += "User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2\r\n";
			str += "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
			str += "Accept-Language:ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3\r\n";
			str += "Accept-Encoding:gzip, deflate\r\n";
			str += "Accept-Charset:windows-1251,utf-8;q=0.7,*;q=0.7\r\n";
			str += "Connection:keep-alive\r\n\r\n";
			mySocket.writeUTFBytes(str);
		}
Локально все работает. Но когда запускаю флешку с другого домена то не робит.
Вот файл crossdomain.xml:
Код:
<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
<site-control permitted-cross-domain-policies="master-only"/> 
<allow-access-from domain="*" to-ports="80,8080" /> 
</cross-domain-policy>
Скрипт пхп работает правильно, к нему вопросов нет.
Помогите найти ошибку.
P.S. я новичок в as3. не ругайте сильно, если что не так.

Старый 15.09.2011, 10:01
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 2  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Вот файл crossdomain.xml:
Сокет не имеет никакого отношения к файлам политик.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 15.09.2011, 10:42
Anton_sz вне форума Посмотреть профиль Отправить личное сообщение для Anton_sz Найти все сообщения от Anton_sz
  № 3  
Ответить с цитированием
Anton_sz

Регистрация: Sep 2011
Сообщений: 9
Вы ошибаетесь. Вот что сказано про это на help.adobe.com:
Так как проигрыватель Flash Player поддерживает два типа подключений к серверу, существует и два типа файлов политики: файлы политики URL-адресов и файлы политики сокетов.
  • Для подключений на основе документов требуются файлы политики URL-адресов. С помощью этих файлов сервер указывает, что его данные и документы доступны для SWF-файлов, размещенных на определенных доменах или на любых доменах.
  • Для подключений к сокетам требуются файлы политики сокетов, которые обеспечивают прямое сетевое подключение к TCP-сокетам нижнего уровня с помощью классов Socket и XMLSocket.

Старый 15.09.2011, 13:34
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 4  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Если соединение делается с использованием классов Socket / XMLSocket, то сразу после соединения либо на порт по умолчанию (забыл какой, но это случайно тот же порт, что Apache использует для SSL), либо на тот же порт, куда вы хотите подключится высылается запрос на получение политик безопасности. Ответ на этот запрос должен выглядеть как содержание файла crossdomain.xml, но наличие файла никак вам не поможет, потому что оно, само по себе никак не связано с открытием порта на том же IP, в то время как программа открывшая порт наверняка уж знает можно или нельзя подключатся.
Вы так же можете указать для определенноги IP в каком порту получать политики безопасности, делается это через
Код AS1/AS2:
Security.loadPolicyFile("xmlsocket://{IP}:{port}");
.
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 15.09.2011 в 13:38.
Старый 15.09.2011, 13:53
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 5  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от Anton_sz Посмотреть сообщение
Вы ошибаетесь. Вот что сказано про это на...
Наверное, я неясно выразился. Файл (файл — поименованная последовательность байтов) в организации доступа по сокету непосредственно может не участвовать. Это может быть xml-like строка в недрах сокет-сервера. И да, вообще crossdomain.xml — это дефолтный файл для разграничения доступа по http(s). Что легко выясняется по предоставленному whitepaper.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 15.09.2011, 14:22
Anton_sz вне форума Посмотреть профиль Отправить личное сообщение для Anton_sz Найти все сообщения от Anton_sz
  № 6  
Ответить с цитированием
Anton_sz

Регистрация: Sep 2011
Сообщений: 9
Спасибо, помогло. Остался еще один вопрос.
При помощи Security.loadPolicyFile("xmlsocket://test.ru:843"); я забираю файл политик. 843 порт слушает скрипт и отдает этот самый файл.
Если запускать флешку из браузера, то соединение с apache устанавливается, но запрос к скрипту не отсылается.
В логах все чисто:
Код:
ОК: Выполнена загрузка SWF-файла корневого уровня: http://www.test1.ru/sockets.swf
ОК: Выполняется поиск директив <allow-access-from> в файлах политики, чтобы авторизовать загрузку данных из ресурса по адресу xmlsocket://test.ru:843 инициатором запроса из http://www.test1.ru/sockets.swf
ОК: Файл политики принят: xmlsocket://test.ru:843
ОК: Запрос ресурса на xmlsocket://test.ru:843 источника запроса из http://www.test1.ru/sockets.swf разрешен согласно файлу политики на xmlsocket://test.ru:843
пробовал после
Код AS3:
mySocket.writeUTFBytes(str);
делать
Код AS3:
mySocket.flush()
, но не помогло.

Причем, если запускать скрипт из flashdevelop, то все работает.
Где я опять ошибся?

Добавлено через 8 минут
Проблему решил. сделал отправку данных в событии
Код AS3:
function onConnect(success:Event):void {
	if (success) {
		field.appendText("Server connection established!\n");
		this.sock.writeUTFBytes( "request" );
		this.sock.flush();
	} else {
		field.appendText("Server connection failed!");
	}
};
И все заработало!
Спасибо за помощь!
Жаль здесь нельзя плюсик в карму поставить


Последний раз редактировалось dimarik; 15.09.2011 в 15:12.
Старый 15.09.2011, 14:39
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 7  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
Цитата:
Жаль здесь нельзя плюсик в карму поставить
Можно, справа сверху у каждого сообщения есть весы, там и можно.
__________________
:)

Старый 15.09.2011, 14:53
Anton_sz вне форума Посмотреть профиль Отправить личное сообщение для Anton_sz Найти все сообщения от Anton_sz
  № 8  
Ответить с цитированием
Anton_sz

Регистрация: Sep 2011
Сообщений: 9
поставил

Старый 15.09.2011, 15:04
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 9  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
а мне?
__________________
:)

Старый 15.09.2011, 15:20
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 10  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от Anton_sz Посмотреть сообщение
Спасибо, помогло. Остался еще один вопрос.
При помощи Security.loadPolicyFile("xmlsocket://test.ru:843"); я забираю файл политик. 843 порт слушает скрипт
Что-то мне нашептывает, что по 843 порту политики отдаются и без запроса и эту строчку можно исключить.

А да, вот оно в whitepaper.

Цитата:
Сообщение от http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/flashplayer/pdfs/flash_player_10_security.pdf
Security.loadPolicyFile()
A policy file allows administrators to grant an application read access to specific server locations (URL policy
files) or to specific port numbers (socket policy files). The default URL policy file is named crossdomain.xml
and is located in the root directory of the target server. The default socket policy file is served from port 843.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Создать новую тему Ответ Часовой пояс GMT +4, время: 13:43.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
actionscript , crossdomain.xml , flash , policy , sockets
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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