2013-05-07 9 views
1

내 문제는 다음이다. 이 코드는 작동합니다. 나는 FX와 Main.mxml 파일이 그 외에도 : 내가 원하는 : 스크립트 코드를연결 ActionScript 클래스 (소켓)

그래서 내가 원하는 (내 원래 파일에서 내가 간단하게 여기이 경우, 연결된 거대한 GUI가있다) Socket으로부터 정보를받을 때 메소드를 호출한다. 그래서 ActionScript 클래스에서 mxml 파일에있는 메서드를 호출하고 싶습니다. 대신 처리 할 수있는 mxml 파일에 이벤트를 보내려고합니다. 나는 import/stuff에 대해 많은 것을 읽었지만 아무런 도움이되지 못했습니다. 액션 스크립트 파일 SocketExample.as : 여기

// http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/Socket.html 

package { 
import flash.display.Sprite; 

public class SocketExample extends Sprite { 
    private var socket:CustomSocket; 

    public function SocketExample() { 
     socket = new CustomSocket("localhost", 80); 
    } 
} 
} 

import flash.errors.*; 
import flash.events.*; 
import flash.net.Socket; 

class CustomSocket extends Socket { 
private var response:String; 

public function CustomSocket(host:String = null, port:uint = 0) { 
    super(); 
    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 { 
    trace("sendRequest"); 
    response = ""; 
    writeln("GET /"); 
    flush(); 
} 

private function readResponse():void { 
    var str:String = readUTFBytes(bytesAvailable); 
    response += str; 
    trace(response); 



    // 
     // Here I want to call the method 
    // 
} 

private function closeHandler(event:Event):void { 
    trace("closeHandler: " + event); 
    trace(response.toString()); 
} 

private function connectHandler(event:Event):void { 
    trace("connectHandler: " + event); 
    sendRequest(); 
} 

private function ioErrorHandler(event:IOErrorEvent):void { 
    trace("ioErrorHandler: " + event); 
} 

private function securityErrorHandler(event:SecurityErrorEvent):void { 
    trace("securityErrorHandler: " + event); 
} 

private function socketDataHandler(event:ProgressEvent):void { 
    trace("socketDataHandler: " + event); 
    readResponse(); 
} 
} 

이 HelloSocket.mxml라는 Main.mxml 파일입니다

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx"> 
<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 


<fx:Script> 
    <![CDATA[ 
     public function HelloWorld():void{ 
      HelloLabel.text = "Hello World"; 
     } 


    ]]> 
</fx:Script> 
<s:Label id="HelloLabel" x="150" y="180" text="Hello" fontSize="20" fontWeight="bold"/> 
</s:WindowedApplication> 

이렇게하여 HelloWorld() 함수가있다 그래서 여기

내 코드입니다 여기서 전화하고 싶습니다. 중요한 점은 GUI와 SocketClient (클래스)가 동시에 실행된다는 것입니다. 이것은 전체 예제 코드입니다.

나에게 모든 것을 알려주세요 나는 수입부터 시작하여,이 예제 작업을해야하고 이벤트 처리 또는 방법은 직접 코드를 변경하고 설명하는 것입니다

최저

를 호출에 포함되어 있습니다.

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 


public class SocketServer { 
public static void main (String args[]) throws IOException { 

     ServerSocket mySocketServer = new ServerSocket(80); 

     System.out.print("Waiting for FlashClient ...\n"); 
     Socket mySocket = mySocketServer.accept(); 

     System.out.print("FlashClient connected.\n\n"); 

     mySocketServer.close(); 

     InputStream in = mySocket.getInputStream(); 
     OutputStream out = mySocket.getOutputStream(); 

     byte buffer[] = new byte[1]; 
     int i = 5; 

     do 
     { 
     // i = in.read(buffer, 0, 1); 
     if (i>-1) out.write("Hello World".getBytes("UTF-8")); 
     try { 
      Thread.sleep (300); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     } while(i>-1); 

     System.out.print("Lost connection to FlashClient.\n\n"); 

     in.close(); 
     out.close(); 

     mySocket.close(); 

} 

} 
+0

메시지가 표시되지 않을지 확신 할 수 없습니다. readMessage를 깨고 여러 조각으로 나눕니다. 이러한 이유로 내부적으로 \ 0을 기다리는 XMLSocket을 사용하고 메시지의 모든 미니 조각을 함께 연결하는 것이 좋습니다. 클라이언트가 메시지를 알 수 있도록 서버에서 \ 0을 추가해야합니다. 또한 서버가 이미 \ 0을 추가하는지 확인하십시오. – Discipol

+0

감사합니다. 이것을 확인하겠습니다. – user2359462

답변

0

감사합니다. Christophe. 그래서 여기에 내 문제에 대한 해결책이있다.

 protected function HelloWorld(event:FlexEvent):void 
     { 
      socketEx.socket.addEventListener("test", Function1); 

     } 

     protected function Function1(e:Event):void{ 
      HelloLabel.text = "World"; 
     } 

:

다음
protected var socketEx:SocketExample = new SocketExample(); 

내 MXML의 방법이 약간 파일을 변경했다 :

첫째, 내 MXML 파일의있는 스크립트에서 액션 스크립트의 인스턴스를 필요 HelloWorld 메서드는 creationComplete에서 호출됩니다. EventListener를 추가합니다. 이 행사는 내 ActionScript 클래스에 전달됩니다 :

private function readResponse():void { 
    var str:String = readUTFBytes(bytesAvailable); 
    response += str; 

    trace(response); 

    this.dispatchEvent(new Event("test")); 

} 

그래서 여기에 그것을 사용하는 지금은 전체 코드입니다 : SocketExample은.로 : // http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/Socket.html

package { 
import flash.display.Sprite; 

public class SocketExample extends Sprite { 
    public var socket:CustomSocket; 

    public function SocketExample() { 
     socket = new CustomSocket("localhost", 80); 
    } 
} 
} 

import flash.errors.*; 
import flash.events.*; 
import flash.net.Socket; 

class CustomSocket extends Socket { 
public var response:String; 

public function CustomSocket(host:String = null, port:uint = 0) { 
    super(); 
    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 { 
    trace("sendRequest"); 
    response = ""; 
    writeln("GET /"); 
    flush(); 
} 

private function readResponse():void { 
    var str:String = readUTFBytes(bytesAvailable); 
    response += str; 

    trace(response); 

    this.dispatchEvent(new Event("test")); 

} 

private function closeHandler(event:Event):void { 
    trace("closeHandler: " + event); 
    trace(response.toString()); 
} 

private function connectHandler(event:Event):void { 
    trace("connectHandler: " + event); 
    sendRequest(); 
} 

private function ioErrorHandler(event:IOErrorEvent):void { 
    trace("ioErrorHandler: " + event); 
} 

private function securityErrorHandler(event:SecurityErrorEvent):void { 
    trace("securityErrorHandler: " + event); 
} 

private function socketDataHandler(event:ProgressEvent):void { 
    trace("socketDataHandler: " + event); 
    readResponse(); 
} 
} 

HelloSocket.mxml :

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx" 
        creationComplete="HelloWorld(event)"> 
<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 


<fx:Script> 
    <![CDATA[ 
     import mx.events.FlexEvent; 
     protected var socketEx:SocketExample = new SocketExample(); 

     protected function HelloWorld(event:FlexEvent):void 
     { 
      socketEx.socket.addEventListener("test", Function1); 

     } 

     protected function Function1(e:Event):void{ 
      HelloLabel.text = "World"; 
     } 



    ]]> 
</fx:Script> 
<s:Label id="HelloLabel" x="150" y="180" text="Hello" fontSize="20" fontWeight="bold"/> 
</s:WindowedApplication> 

난 그 사람을 도움이되기를 바랍니다. 그래서 Java SocketServer (내 질문에 코드 참조)에서 메시지를 보내고 플래시로 받아서 .mxml 파일의 스크립트 코드에서 사용하는 방법입니다.

0

는 MXML 파일이 기본 응용 프로그램 파일입니다 당신이 그것을 테스트하려는 경우 내가 미리

에 대단히 감사합니다, 여기에 일치하는 자바 소켓 서버입니다. 즉, CustomSocket의 인스턴스를 만들고 거기에서 이벤트를 수신해야합니다.

메인 애플리케이션과 소켓의 관계가 하향식이기 때문에 소켓이 애플리케이션과 통신하는 방법은 직접 메소드 호출이 아닌 이벤트를 통해 이루어집니다. 데이터가 들어오고 소켓 내에서 응용 프로그램에 알리고 싶으면 이벤트를 전달하십시오.