![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Sep 2011
Сообщений: 28
|
Имеется самописный сервер на java
При подключении от флеша присылается <policy-file-request/>, на что ему отправляю в сокет строчку <?xml version="1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"8234\" /></cross-domain-policy>\0 Флешевое приложение никак не реагирует, и спустя какое-то время сообщает об ошибки безопасности. Знаю, что есть решение разместить файл с точно таким же содержанием в корне домена к которому обращаемся. Проблема в том что обращаться собираюсь по айпишнику, а не по домену и вебсервера на машине с сервером скорее всего не будет. Что я делаю не так? Последний раз редактировалось Zizilk; 21.09.2011 в 00:18. |
|
|||||
|
Регистрация: Jan 2010
Сообщений: 28
|
вроде всё правильно делаете...
единственное: в приведённой вами xml'ке, первая кавычка не заэкранирована. Если в отправляемой вами строчке также, то причина возможно в этом. <?xml version="1.0\"?><cross-domain-poli...
__________________
GAE + Flex = CyoaWare =) |
|
|||||
|
Регистрация: Sep 2011
Сообщений: 28
|
Вот строчка пересылаемая
<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy SYSTEM \"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd\"><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" meta-policy=\"master-only\"/></cross-domain-policy>\0 код для связи с клиентом изменился толку нет Клиент будет предельно простой, поэтому пишу код прямо в actions кадра Последний раз редактировалось Zizilk; 20.09.2011 в 15:35. Причина: Изменение кода, поэтому пост не актуален |
|
|||||
|
Регистрация: May 2010
Адрес: пространство в положении
Сообщений: 219
|
видел такие проблемы, решались они добавлением нулевого симвоба "u0000" (вроде так), а вообще поищите в инете пример сервера по отдачи кроссдоменика - их много. (я поищу свой пример, где-то он валялся).
|
|
|||||
|
Регистрация: Sep 2011
Сообщений: 28
|
Последовал совету выдрал из OPENfire точный синтаксис и всё равно ошибка #2048///
|
|
|||||
|
Регистрация: Jan 2010
Сообщений: 28
|
Цитата:
Честно говоря, тут сложно что-либо посоветовать. Вы всё делаете правильно. Следовательно, проблема в невнимательности. Если хотите, могу вам быстро набросать сокет-сервер на питоне, что бы вы могли проверить, всё ли правильно у вас со стороны флешки. Как вариант, можно ещё попробовать добавить тегу allow-access-from, атрибут secure='false'. Цитата:
__________________
GAE + Flex = CyoaWare =) |
|
|||||
|
Посмотрите, может поможет.
|
|
|||||
|
Регистрация: Sep 2011
Сообщений: 28
|
Вывел работу с полиси в отдельный поток, привязал прослушку порта 843, результат нулевой. Те сервер пишет что отправлено, клиент же не получает.
лог клиента securityErrorHandler: [SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048"] 20.09.2011 21:29:51 ServerFlashRunnable flashrun INFO: new Flash connection 20.09.2011 21:29:54 ServerFlashRunnable flashrun INFO: Flash is connecting | '<policy-file-request/> ' 20.09.2011 21:29:54 ServerFlashRunnable flashrun INFO: Send to flash | '<?xml version="1.0"?><!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtd ss-domain-policy.dtd"><cross-domain-policy><allow-access-from secure='false' domain="*" to-ports="8234" /></cross-d -policy> ' 20.09.2011 21:29:54 ServerFlashRunnable flashrun INFO: Flash new Connection closed private static void flashrun(Socket gsock)
{
log.info("new Flash connection");
InputStream fromguest=null;
OutputStream toguest=null;
try
{
fromguest=gsock.getInputStream();
toguest=gsock.getOutputStream();
}
catch(IOException e)
{
log.warning("Can't create Flash streams");
}
if((fromguest!=null)&&(toguest!=null))
{
Scanner in = new Scanner(fromguest);
PrintWriter out = new PrintWriter(toguest,true);
String outcoming;
if(Server.Server_ch())
{
while (in.hasNextLine() )
{
String incoming = in.nextLine();
if (incoming.equals("<policy-file-request/>\0"))
{
log.info("Flash is connecting | '"+incoming+"'");
outcoming=CROSS_DOMAIN_TEXT +"8234"+CROSS_DOMAIN_END_TEXT+"\n";
log.info("Send to flash | '"+outcoming+"'");
out.write(outcoming);
if (out != null) {
out.flush();
out.close();
}
if (in != null) {
in.close();
}
if (gsock != null) {
try
{
log.info("Flash new Connection closed");
gsock.close();
}
catch(IOException e)
{
log.warning("Can't close Flash connection");
}
}
}
else
{
try
{
log.info("Flash new Connection closed");
gsock.close();
}
catch(IOException e)
{
log.warning("Can't close flash connection");
}
}
}
}
else
{
try
{
log.info("Connection closed");
gsock.close();
}
catch(IOException e)
{
log.warning("Can't close connection");
}
}
}
}
Код тествого фрейма Код myGlobals package { import flash.errors.*; import flash.events.*; import flash.net.Socket; public class MyGlobal extends Socket { private var response:String; private var stat; public function MyGlobal(host:String , port:uint, st) { super(); stat=st; configureListeners(); if (host && port) { super.connect(host, port); } } private function configureListeners():void { addEventListener(Event.CLOSE, closeHandler); addEventListener(Event.CONNECT, connectHandler); addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler); } private function writeln(str:String):void { str += "\n"; try { writeUTFBytes(str); } catch(e:IOError) { trace(e); } } private function sendRequest():void { stat.htmlText="sendRequest"; response = ""; writeln("GET /"); flush(); } private function readResponse():void { var str:String = readUTFBytes(bytesAvailable); response += str; } private function closeHandler(event:Event):void { stat.htmlText="closeHandler: " + event; trace(response.toString()); } private function connectHandler(event:Event):void { stat.text="connectHandler: " + event; sendRequest(); } private function ioErrorHandler(event:IOErrorEvent):void { stat.htmlText="ioErrorHandler: " + event; } private function securityErrorHandler(event:SecurityErrorEvent):void { stat.htmlText="securityErrorHandler: " + event; } private function socketDataHandler(event:ProgressEvent):void { stat.htmlText="socketDataHandler: " + event; readResponse(); } } } Ps идей почему у меня такое нет совершенно. Вернее те что есть попахивают шаманизмом, вроде попробовать насильно конвертить отправляемую строку в UTF8. Если важно сервер поднят на одной машине с вебсервером, на котором лежит тот флеш файл. Веб сервер и мой сервер работают на разных портах. PPs Решил от нефиг делать запустить из адоб флеша, через паблиш превью. Запустилось, но реквеста не последовало, вместо этого тупо приконектилось туда куда прошу, а не на полиси порт, и гордо выдало о получении "fail" (так как я брал из примера адобовского и там в обработчике подключения так и стоит отправка чего-то, в этом чём-то сервер формата родного запроса не узнал и послал "fail"'ом клиент)... Затык где то именно в этой долбанном хендшейке. PPPs веб сервер(у меня xampp), на котором висит флешка надо как-то настраивать? Добавлено через 1 час 38 минут Заработало... почувствовал себя доктором франкенштейном и до конца не понимаю, чё делаю таки сделал... Вот готовый класс к запуску в отдельном потоке если чё. class ServerFlashRunnable implements Runnable
{
private ServerSocket flashsock;
private static final Logger log=Logger.getLogger("main.thread");
public static String CROSS_DOMAIN_TEXT = "<?xml version=\"1.0\"?>"+
"<!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\">" +
"<cross-domain-policy>" +
"<allow-access-from secure='false' domain=\"*\" to-ports=\"";
public static String CROSS_DOMAIN_END_TEXT ="\" /></cross-domain-policy>";
public ServerFlashRunnable(ServerSocket sock)
{
flashsock=sock;
}
public void run()
{
log.info("Flash tread starts");
while(Server.Server_ch())
{
try
{
Socket gsock=flashsock.accept();
flashrun(gsock);
}
catch(IOException e)
{
log.warning("Can't accept flash connection");
}
}
}
private static void flashrun(Socket gsock)
{
log.info("new Flash connection");
InputStream fromguest=null;
OutputStream toguest=null;
try
{
fromguest=gsock.getInputStream();
toguest=gsock.getOutputStream();
}
catch(IOException e)
{
log.warning("Can't create Flash streams");
}
if((fromguest!=null)&&(toguest!=null))
{
BufferedReader in = new BufferedReader(new InputStreamReader(fromguest));
PrintWriter out = new PrintWriter(toguest,true);
String outcoming;
String request = "";
request = read(in);
if(Server.Server_ch())
{
if (request.contains("<policy-file-request/>") || request.contains("GET /crossdomain.xml")) {
out.write(CROSS_DOMAIN_TEXT +
"8234" + //порт который надо открыть пихаем сюда
CROSS_DOMAIN_END_TEXT+"\u0000");
}
try
{
out.flush();
out.close();
in.close();
log.info("Connection closed");
gsock.close();
}
catch(IOException e)
{
log.warning("Can't close connection");
}
}
else
{
try
{
log.info("Connection closed");
gsock.close();
}
catch(IOException e)
{
log.warning("Can't close connection");
}
}
}
}
protected static String read(BufferedReader in) {
StringBuffer buffer = new StringBuffer();
int codePoint;
boolean zeroByteRead = false;
try {
do {
codePoint = in.read();
if (codePoint == 0 || codePoint == '\n') {
zeroByteRead = true;
}
else if (Character.isValidCodePoint(codePoint)) {
buffer.appendCodePoint(codePoint);
}
}
while (!zeroByteRead && buffer.length() < 200);
}
catch (Exception e) {
log.warning("Exception (read): " + e.getMessage());
}
return buffer.toString();
}
}
Последний раз редактировалось Zizilk; 20.09.2011 в 22:54. |
|
|||||
|
Регистрация: Jun 2011
Сообщений: 10
|
Прошу прощения, у меня похожая ошибка. Уже что только не перепробовал...
В чем у вас проблема была? (у меня просто серверная часть на node.js и взять ваше решение не могу) |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:00. |
|
|
« Предыдущая тема | Следующая тема » |
|
|