0

as3 socket

Posted in 杂七杂八 at 九月 20th, 2012 / No Comments »

AS3是单线程的,虽然可以模拟多线程,但毕竟那是假的,如果开发一些大一点的项目,后台技术是必不可少的了。

Socket是Flash固有的了,而且比较高效,因为它是以流的形式传递的,而webservice httpservice 是通过字符串传递的。如果使用XML Socket类来进行Socket连接的话,它是不能自动穿越防火墙的,要想穿过防火墙进行连接,则需要使用基于HTTP协议的RTMP协议。

 

一:Socket连接
1:建立连接
当然,要知道服务器的地址和端口,通过方法Socket.connect()或者XMLSocket.connect()与服务器建立连接,代码如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//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.”);
}

XMLSocket的代码类似
2:关于安全沙箱问题
.swf文件和主机必须为同一域名
网上发布的.swf不可以访问本地服务器
本地未通过认证的.swf文件不可以访问任何网络资源
想夸域访问或连接1024端口,必须使用一个跨域策略文件,如果尝试连接未认证的域或者低端口服务,这样就违反了安全沙箱策略,同时会激发securityError事件,你可以通过使用一个跨域策略文件来解决,必须在Socket连接之前通过使用flash.system.Security.loadPolicyFile()方法加载策略文件:
如:

1
2
3
4
5
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:发送数据
1.flash.net.Socket类
首先使用write方法向缓存写入数据,然后使用flush()方法发送数据
writeBoolean: 只接受一个布尔值作为参数
writeByte、writeDouble、 writeFloat、 writeInt、writeUnsignedInt、writeShort :接受一个数字型参数)
writeBytes:teArray参数,偏移量参数,长度参数
writeObject:受一个object作为参数,但必须序列化为AMF格式
writeUTF、writeUTFBytes: 字符串类型参数
writeMultiByte: 串类型参数,并带有字符集参数,如ocket.writeMultiByte(“example”, “unicode”);
flush() 将write方法写入缓存去的所有数据一并发送到服务器,并且清空缓存区。
如:

1
2
3
4
5
6
7
8
//Socket发送数据
protected function BT_SKSendclick(event:MouseEvent):void
{
   if(mySocket.connected){
       mySocket.writeUTFBytes(this.TI_SKSend.text);
       mySocket.flush()
   }
}

2.flash.net.XMLSocket类
调用send()方法发送数据,send()方法可以接受任何数据类型的参数.它可以将所有的参数都转换为一个字符串类型并发送到服务器.通常参数为一个XML对象或者一个包含数据结构类似XML数据的字符串: xmlSocket.send(xml);
如:

1
2
3
4
5
6
7
//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:读取数据
flash.net.Socket类

方法:返回值类型 描述 字节
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方法:
一个flash.util.ByteArray实例读取从socket中收到的数据
一个uint值,指定从什么位置开始读取socket中收到数据的偏移量.默认值为0
一个uint值,用于指定读取bytes的数量.默认值为0,意思就是说将所有的可用的数据都放入ByteArray中
readUTFBytes方法:只需要一个长度参数用于指定UTF-8字节的读入数量,并且该方法会将所有读入的字节码转换成为字符串类型

为ocketData事件添加一个事件监听器,任何时候只要有新的数据从一个socket服务器发送过来,都会触发事件控制器.在事件处理器的内部我们写入我们要执行的代码去读取和处理收到的数据

在从一个Socket读数据之前,首先要判断bytesAvailable的属性.如果你不知道要读入的数据类型是什么就去读数据的话,将会产生一个错误(flash.errors.EOFError).

读取服务器中传送过来的数据,代码如下:

1)首先注册事件

1
mySocket.addEventListener(ProgressEvent.SOCKET_DATA,mySocketOnDataGet);

2)事件处理

1
2
3
4
5
6
7
8
9
//Socket获取数据
private function mySocketOnDataGet( event:ProgressEvent ):void {
   this.TA_SocketGet.appendText(“rn”);
   this.TA_SocketGet.appendText(“Socket received “ mySocket.bytesAvailable ” byte(s) of data:rn”);
   while(mySocket.bytesAvailable){
       var msg:String = mySocket.readUTFBytes(mySocket.bytesAvailable);
       this.TA_SocketGet.appendText(msg+”rn”);
   }
}

flash.net.XMLSocket类
使用XMLSocket从服务器返回的数据总是认为是一个字符串类型的数据.这样不用为任何数据类型的数据指定读取方法,这些从服务器返回的数据是没有经过任何处理的原始数据.因此,你不能通过XMLSocket连接立即使用XML,你发送和接收的都是纯字符串数据.如果你期望XML,在你处理数据之前,你必须首先将这些数据转换为一个XML的实例

注意:在data事件分发数据之前,XMLSocket实例必须从服务器收到一个表示为空的byte(‘′).也就是说,从服务器仅仅只发送所需要的字符串是不够的,必须在结尾处加入一个表示为空的byte

 

http://blog.csdn.net/baijinwen/article/details/6190587

Published in 杂七杂八
Tags: , ,

No Responses to “as3 socket”

Leave a Reply

请输入算式结果(看不清请点击图片)
(必须)