2013-05-07 42 views
1

我的问题是以下几点:使用mxml连接ActionScript类(Socket)脚本代码

我有一个表示socket客户端的动作脚本类。此代码有效。 除了我与FX一个Main.mxml文件:脚本代码(在我的原始文件,连接有巨大的GUI,在这种情况下,在这里我把它简单)

所以我想: 我想从Socket接收信息时调用方法。所以我想调用actionscript类的mxml文件中的方法。 作为替代方案,我想将事件发送到可以在那里处理的mxml文件。 我读了很多关于import/include的东西等,但没有什么帮助。

因此,这里是我的代码: 的ActionScript文件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(作为类)同时运行。 这是我有的完整示例代码。

请告诉我,我需要的一切使这个例子工作,从进口开始,包括对事件处理或方法调用

最好将直接改变我的代码,并解释。 我非常感谢你提前

如果你想测试一下,这里是一个匹配的Java socket服务器:

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 2013-05-08 08:35:08

+0

谢谢,我会检查这个 – user2359462 2013-05-08 22:32:14

回答

0

谢谢Christophe。所以这是解决我的问题。

首先,我需要的动作的实例脚本是我的MXML文件:

protected var socketEx:SocketExample = new SocketExample(); 

然后我不得不改变我的MXML方法文件1位:

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

     } 

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

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发送消息(请参阅我的问题中的代码),在Flash中接收它并在.mxml文件的脚本代码中使用它。

0

你的MXML文件是你的主应用程序文件。这意味着你将不得不在那里创建你的CustomSocket的一个实例,并从中收听事件。

由于从主应用程序到套接字的关系是自上而下的,套接字与应用程序通信的方式是通过事件而不是通过直接方法调用。当数据进入并且你想从套接字中通知应用程序时,发送一个事件。