2011-12-26 3 views
1

У меня есть сервер Groovy и клиент Flex. Когда я пытаюсь подключиться из приложения Flex к Groovy, я получаю сообщение <policy-file-request/>. Затем я отправляю некоторый ответ XML-политики и пытаюсь отправить что-то на сервер. Но вместо того, чтобы получать что-то на стороне Groovy, я ничего не получаю. И через несколько секунд я получаю SecurityException со стороны приложения Flex.Подключение к разъему Flex

Groovy код сервера:

import java.util.Scanner 

class server 
{ 
    public static handleConnection(client) 
    { 
     PrintWriter socketwriter = new PrintWriter(client.getOutputStream()) 

     Scanner socketreader = new Scanner(client.getInputStream()) 

     while (socketreader.hasNext()) 
     { 
      String s = socketreader.nextLine() 

      println s 

      if (s =~ /<policy-file-request\s*\/>/) 
      { 

       socketwriter.print("<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy SYSTEM \"/xml/dtds/cross-domain-policy.dtd\"><cross-domain-policy><site-control permitted-cross-domain-policies=\"master-only\" /><allow-access-from domain=\"*\" to-ports=\"2900-2910\" /></cross-domain-policy>\n\0\n") 

       socketwriter.flush() 
       socketwriter.close() 
       client.close() 

       println "Policy File sent." 

       return 
      } 
     } 

     socketwriter.print("Connection: Done.\n") 
     socketwriter.flush() 

     socketwriter.close() 
     socketreader.close() 
    } 

    static main(args) 
    { 
     ServerSocket serversocket 

     try 
     { 
      serversocket = new ServerSocket(2900) 

      println "Server is up and running" 

      while (true) 
      { 
       Socket client = serversocket.accept() 

       Thread.start { 
        server.handleConnection(client) 
       } 
      } 
     } catch (e) 
     { 
      e.printStackTrace() 
     } finally 
     { 
      serversocket.close() 
     } 
    } 
} 

Flex код клиента:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:Script> 
     <![CDATA[ 
      import flash.net.Socket; 
      import flash.events.*; 
      import mx.controls.Alert; 

      private var socket : Socket; 

      private function connect() : void 
      { 
       socket = new Socket(); 

       socket.addEventListener(Event.CONNECT, onConnect); 
       socket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData); 
       socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, ServerSecurityError); 

       socket.connect("localhost", 2900); 

       Alert.show("yay!"); 
      } 

      private function ServerSecurityError(evt : Event) : void 
      { 
       Alert.show("security error") 
      } 

      private function onConnect(evt : Event) : void 
      { 
       Alert.show("Connected to server!"); 
      } 

      private function onSocketData(evt : ProgressEvent) : void 
      { 
       var data : String = socket.readUTFBytes(socket.bytesAvailable); 
       Alert.show("Read: " + data); 
      } 

      private function send() : void 
      { 
       var msg : String = "Hello, World!"; 
       socket.writeUTFBytes(msg); 
       socket.flush(); 
       Alert.show("Sent: " + msg); 
      } 
     ]]> 
    </mx:Script> 

    <mx:Button label="connect" click="connect()" x="10" y="10" /> 
    <mx:Button label="send something" click="send()" x="10" y="40" /> 
</mx:Application> 

Итак, вопрос: Как я должен соединиться, чтобы получить устойчивую связь между сервером и клиентом?

+0

Я думаю, вы должны предоставить нам полное сообщение об ошибке. Я предполагаю, что это проблема с перекрестными доменами. Предоставлен ли SWF с массивного сервера? – JeffryHouser

+0

@ www.Flextras.com Благодарим вас за ответ. Я получаю сообщение об ошибке в методе 'ServerSecurityError'. У вас есть идеи о том, как я могу получить сообщение об ошибке там? – shybovycha

+0

Вся соответствующая информация должна быть в том случае, если она отправлена ​​в этот метод. – JeffryHouser

ответ

2

SecurityError происходит по следующим причинам (из документации):

  • Локальные ненадежные SWF-файлы не могут взаимодействовать с Интернетом. Вы, , можете обойти это ограничение, реклассифицируя файл как локально с сетью или как доверенный.
  • Вы не можете указать сокет порт выше 65535.
  • На странице HTML, содержащей SWF-содержимое, параметр allowNetworking объекта и встраивает теги установлен в «нет».

Мы бежим подобную установку (используя чистый AS3 внешний интерфейс), и, прежде чем я сделать вызов connect(), звоню:

Security.loadPolicyFile("xmlsocket://" + this.m_host + ":" + this.m_policyFilePort);

где m_host может быть что-то вроде «локальный »и m_policyFilePort - это любой порт, на котором вы его обслуживаете. Вы можете найти более подробную информацию о нем here, или at the Socket files