AS3是单线程的,虽然可以模拟多线程,但毕竟那是假的,如果开发一些大一点的项目,后台技术是必不可少的了。
对于AIR,如果要开发针对于Windows的Flex桌面程序的话,建议还是使用vb+flex或者c++ +flex,不建议使用air技术。
如果使用Flex开发BS架构的系统,它与服务端的通信有以下几种:WebService, HttpServices,RmoteObject ,Socket(Socket 、XML Socket). Socket是Flash固有的了,而且比较高效,因为它是以流的形式传递的,而webservice httpservice 是通过字符串传递的。如果使用XML Socket类来进行Socket连接的话,它是不能自动穿越防火墙的,要想穿过防火墙进行连接,则需要使用基于HTTP协议的RTMP协议。
一:Socket连接
1:建立连接
当然,要知道服务器的地址和端口,通过方法Socket.connect( )或者XMLSocket.connect( )与服务器建立连接,代码如:
<textarea cols="50" rows="15" name="code" class="c-sharp:nogutter">//Socket private var mySocket:Socket; //Socket连接 protected function BT_SKConnectClick(event:MouseEvent):void { try{ mySocket = new Socket(); mySocket.addEventListener(Event.CONNECT,mySocketOnConnect); mySocket.addEventListener(IOErrorEvent.IO_ERROR,mySocketOnError); mySocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,mySocketOnSecurityError); mySocket.addEventListener(ProgressEvent.SOCKET_DATA,mySocketOnDataGet); // 连接 mySocket.connect( TI_SKIPAddress.text, int(TI_SKPort.text) ); }catch(ex:Error){} } //Socket连接成功 private function mySocketOnConnect( event:Event ):void { Alert.show("Socket已经连接."); } //Socket连接失败 private function mySocketOnError( event:Event ):void { Alert.show("Socket连接失败."); } //安全错误 private function mySocketOnSecurityError( event:Event ):void { Alert.show("发生SecurityError."); }</textarea>
XMLSocket的代码类似
2:关于安全沙箱问题
如:Security.loadPolicyFile("http://www.Test.com/crossdomain.xml");
<!DOCTYPE cross-domain-policy SYSTEM "http://testWeb.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" to-ports="80,110" />
</cross-domain-policy>
to-ports可以设置一个或多个端口,如果不设置,FlashPlaper默认是80端口。
3:发送数据
首先使用write方法向缓存写入数据,然后使用flush()方法发送数据
writeBoolean: 只接受一个布尔值作为参数
writeByte、writeDouble、 writeFloat、 writeInt、writeUnsignedInt、writeShort :接受一个数字型参数)
writeBytes:teArray参数,偏移量参数,长度参数
writeObject:受一个object作为参数,但必须序列化为AMF格式
writeUTF、writeUTFBytes: 字符串类型参数
writeMultiByte: 串类型参数,并带有字符集参数,如ocket.writeMultiByte("example", "unicode");
flush() 将write方法写入缓存去的所有数据一并发送到服务器,并且清空缓存区。
如:
<textarea cols="50" rows="15" name="code" class="c-sharp">//Socket发送数据 protected function BT_SKSendclick(event:MouseEvent):void { if(mySocket.connected){ mySocket.writeUTFBytes(this.TI_SKSend.text); mySocket.flush() } }</textarea>
调用send()方法发送数据,send()方法可以接受任何数据类型的参数.它可以将所有的参数都转换为一个字符串类型并发送到服务器.通常参数为一个XML对象或者一个包含数据结构类似XML数据的字符串: xmlSocket.send(xml);
如:
<textarea cols="50" rows="15" name="code" class="c-sharp:nogutter">//XML Socket发送 protected function BT_XMLSKSendclick(event:MouseEvent):void { if(myXMLSocket.connected){ myXMLSocket.send(this.TI_XMLSKSend.text+"/n"); }else{Alert.show("XML Socket无法连接服务器.");} }</textarea>
准确的格式完全依赖于服务器所能够接受的格式.如果服务器接受XML格式的数据,你必须发送XML格式的数据.如果服务器只接受URL编码的数据,你也必须发送URL编码的数据.
4:读取数据
方法:返回值类型 |
描述 |
字节数 |
readBoolean( ):Boolean |
从Socket读取一个Boolean值. |
1 |
readByte( ):int |
从Socket读取一个byte值. |
1 |
readDouble( ):Number |
从Socket读取一个IEEE 754双精度浮点数. |
8 |
readFloat( ):Number |
从Socket读取一个IEEE 754单精度浮点数. |
4 |
readInt( ):int |
从Socket读取一个有符号32-bit整数值. |
4 |
readObject( ):* |
从Socket读取一个AMF-encoded对象. |
n |
readShort( ):int |
从Socket读取一个有符号16-bit整数值. |
2 |
readUnsignedByte( ):uint |
从Socket读取一个无符号字节. |
1 |
readUnsignedInt( ):uint |
从Socket读取一个无符号32-bit整数 |
4 |
readUnsignedShort( ):uint |
从Socket读取一个无符号16-bit整数. |
2 |
readUTF( ):String |
从Socket读取一个一个UTF8字符串. |
n |
readBytes方法:
readUTFBytes方法:只需要一个长度参数用于指定UTF-8字节的读入数量,并且该方法会将所有读入的字节码转换成为字符串类型
为ocketData事件添加一个事件监听器,任何时候只要有新的数据从一个socket服务器发送过来,都会触发事件控制器.在事件处理器的内部我们写入我们要执行的代码去读取和处理收到的数据
在从一个Socket读数据之前,首先要判断bytesAvailable的属性.如果你不知道要读入的数据类型是什么就去读数据的话,将会产生一个错误(flash.errors.EOFError).
读取服务器中传送过来的数据,代码如下:
<textarea cols="50" rows="15" name="code" class="c-sharp:nogutter">1)首先注册事件 mySocket.addEventListener(ProgressEvent.SOCKET_DATA,mySocketOnDataGet); 2)事件处理 //Socket获取数据 private function mySocketOnDataGet( event:ProgressEvent ):void { this.TA_SocketGet.appendText("/r/n"); this.TA_SocketGet.appendText("Socket received " + mySocket.bytesAvailable + " byte(s) of data:/r/n"); while(mySocket.bytesAvailable){ var msg:String = mySocket.readUTFBytes(mySocket.bytesAvailable); this.TA_SocketGet.appendText(msg+"/r/n"); } }</textarea>
使用XMLSocket从服务器返回的数据总是认为是一个字符串类型的数据.这样不用为任何数据类型的数据指定读取方法,这些从服务器返回的数据是没有经过任何处理的原始数据.因此,你不能通过XMLSocket连接立即使用XML,你发送和接收的都是纯字符串数据.如果你期望XML,在你处理数据之前,你必须首先将这些数据转换为一个XML的实例
注意:在data事件分发数据之前,XMLSocket实例必须从服务器收到一个表示为空的byte('//0').也就是说,从服务器仅仅只发送所需要的字符串是不够的,必须在结尾处加入一个表示为空的byte
5:最终运行效果如:
6: 使用vs2010+Flash Builder Burrito(煎饼)创建的小例子:
http://download.csdn.net/source/3030072