- 浏览: 15080 次
最新评论
Flex Socket编程
- 博客分类:
- 技术杂绘
Flex Socket编程
2011年02月17日
比较懒,比较少上csdn的,如果发现留言给我没有回复,望见谅。
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( )与服务器建立连接,代码如: //Socket private var mySocket:Socket; //Socket连接 protected function BT_SKConnectClick(event:MouseEvent):void { try{ mySocket = new Socket(); mySocket.addEventListener(Event.CONNECT,mySocketOn Connect); mySocket.addEventListener(IOErrorEvent.IO_ERROR,my SocketOnError); mySocket.addEventListener(SecurityErrorEvent.SECUR ITY_ERROR,mySocketOnSecurityError); mySocket.addEventListener(ProgressEvent.SOCKET_DAT A,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."); } XMLSocket的代码类似
2:关于安全沙箱问题 网上发布的.swf不可以访问本地服务器
本地未通过认证的.swf文件不可以访问任何网络资源
想夸域访问或连接1024端口,必须使用一个跨域策略文件,如果尝试连接未认证的域或者低端口服务,这样就违反了安全沙箱策略,同时会激发securityError事件,你可以通过使用一个跨域策略文件来解决,必须在Socket连接之前通过使用flash.system.Security.loadPolicyFile()方法加载策略文件:
如:Security.loadPolicyFile("http://www.Test.com/cross domain.xml"); 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方法写入缓存去的所有数据一并发送到服务器,并且清空缓存区。
如: //Socket发送数据 protected function BT_SKSendclick(event:MouseEvent):void { if(mySocket.connected){ mySocket.writeUTFBytes(this.TI_SKSend.text); mySocket.flush() } } 调用send()方法发送数据,send()方法可以接受任何数据类型的参数.它可以将所有的参数都转换为一个字符串类型并发送到服务器.通常参数为一个XML对象或者一个包含数据结构类似XML数据的字符串: xmlSocket.send(xml);
如: //XML Socket发送 protected function BT_XMLSKSendclick(event:MouseEvent):void { if(myXMLSocket.connected){ myXMLSocket.send(this.TI_XMLSKSend.text+"\n"); }else{Alert.show("XML Socket无法连接服务器.");} } 准确的格式完全依赖于服务器所能够接受的格式.如果服务器接受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方法: 一个uint值,指定从什么位置开始读取socket中收到数据的偏移量.默认值为0
一个uint值,用于指定读取bytes的数量.默认值为0,意思就是说将所有的可用的数据都放入ByteArray中
readUTFBytes方法:只需要一个长度参数用于指定UTF-8字节的读入数量,并且该方法会将所有读入的字节码转换成为字符串类型
为ocketData事件添加一个事件监听器,任何时候只要有新的数据从一个socket服务器发送过来,都会触发事件控制器.在事件处理器的内部我们写入我们要执行的代码去读取和处理收到的数据
在从一个Socket读数据之前,首先要判断bytesAvailable的属性.如果你不知道要读入的数据类型是什么就去读数据的话,将会产生一个错误(flash.errors.EOFError).
读取服务器中传送过来的数据,代码如下: 1)首先注册事件 mySocket.addEventListener(ProgressEvent.SOCKET_DAT A,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"); } } 使用XMLSocket从服务器返回的数据总是认为是一个字符串类型的数据.这样不用为任何数据类型的数据指定读取方法,这些从服务器返回的数据是没有经过任何处理的原始数据.因此,你不能通过XMLSocket连接立即使用XML,你发送和接收的都是纯字符串数据.如果你期望XML,在你处理数据之前,你必须首先将这些数据转换为一个XML的实例 注意:在data事件分发数据之前,XMLSocket实例必须从服务器收到一个表示为空的byte('\\0').也就是说,从服务器仅仅只发送所需要的字符串是不够的,必须在结尾处加入一个表示为空的byte
5:最终运行效果如:
6: 使用vs2010+Flash Builder Burrito(煎饼)创建的小例子:
发表评论
-
Building a custom Flex preloader
2012-01-20 01:23 629Building a custom Flex preloade ... -
Flex4的可视化显示对象
2012-01-20 01:23 705Flex4的可视化显示对象 2011年05月12日 fl ... -
如何在flex当中使用swc
2012-01-20 01:23 735如何在flex当中使用swc 2 ... -
Flex富文本编辑器
2012-01-20 01:23 1159Flex富文本编辑器 2010年07月08日 近来在开发 ... -
流媒体中国(liumeiti.com)专访我公司总经理
2012-01-19 09:13 786流媒体中国(liumeiti.com) ... -
MT规划__运营、策划、发展、进度------南京南立视优公司1
2012-01-19 09:13 706MT规划__运营、策划、发展、进度------南京南立视优公司 ... -
做工控的朋友,留着可能有不时之需.2011工控破解,助你一臂之力!
2012-01-19 09:13 2545做工控的朋友,留着可能有不时之需.2011工控破解,助你一臂之 ... -
本人指导07级本科毕业设计/论文的题目
2012-01-19 09:13 806本人指导07级本科毕业设计/论文的题目 2010年10月11 ... -
delphi经典技艺
2012-01-17 01:43 658delphi经典技艺 2012年01月10日 http: ... -
心目中的Asp.net核心对象
2012-01-17 01:43 561心目中的Asp.net核心对象 2011年09月16日 ... -
java常用面试题
2012-01-17 01:43 613java常用面试题 2011年03月31日 JAVA 面 ... -
探索Linux内核空间文件IO实现
2012-01-17 01:43 818探索Linux内核空间文件IO ... -
黑客必知的DOS命令大全
2012-01-17 01:43 723黑客必知的DOS命令大全 2011年12月24日 cmd ... -
10] 建立C帝国(GDAL编译安装以及一般的C库编译步骤)
2012-01-15 20:57 55010] 建立C帝国(GDAL编译安 ... -
HK-2000数据采集仪WEB服务器BOA的移植方法
2012-01-15 20:57 608HK-2000数据采集仪WEB服务器BOA的移植方法 200 ... -
如何为linux嵌入式开发建立交叉编译环境(2.4内核)
2012-01-15 20:57 541如何为linux嵌入式开发建立交叉编译环境(2.4内核) 2 ... -
【转】如何为嵌入式开发建立交叉编译环境
2012-01-15 20:57 597【转】如何为嵌入式开发建立交叉编译环境 2009年10月26 ... -
EGLIBC库介绍
2012-01-15 20:57 630EGLIBC库介绍 2011年05月05 ...
相关推荐
flex+socket编程实例,提供源码参考,请查看
Flex3+Socket编程示例;包括配置,聊天室源代码
Flex 的socket通信 提供实例代码
flex socket 2030 错误 粘包.txt 看完就明白了
flex 和java 之间的相互通信
对flex开发socket的服务的一个总结,包括连java,c++的server socket
web flex应用通过socket与C++编写的服务端进行通讯的一个例子,包括服务端代码(VC编译),flex的mxml文件(flex3builder新建web flex工程后,用该mxml文件直接替换src里的mxml文件即可)
Flex 4 高级编程Flex 4 高级编程Flex 4 高级编程Flex 4 高级编程
最详细的FLEXA编程教程PPT课件.pptx
研究flex的通信问题,写了一个flex的Socket与C#通信例子,类似QQ软件的客户端和服务器端。
安全沙漏令很多初搞flex socket的朋友头痛,我也一样!!!! 此例解决了这个问题。服务端 用的java。客户端用的是xmlSocket。(客户端用socket也是雷同)
Flex拖拽编程详解,Flex拖动方法。
flex3 programing,中文版分享于同僚~~
《Adobe Flex 3 高级编程》官网源码 第28章有619兆而没有上传
flexa 编程,供SMT行业同仁使用。
编程基础语法 流程控制语句 控制语句和数据类型 面对对象编程 静态常量继承和接口 数组和类型转换
Flex白皮书 Flex cookbok Flex编程指南 Flex设计模式等
flex高级编程源码 flex红皮书源码 wrox flex提高的源码,可供急需的朋友参考
flex的socket客户端连接java多线程socket服务端demo
flex C# 基于socket 通讯 应用程序源码 客户度用flex 服务端用winform 的通讯程序,可以互发消息。