Socket连接被普遍用于创建多用户应用程序,比如说一个在线聊天室,它有一个服务端程序和无数个Flash客户端组成。每次客户端发送消息给服 务器,服务器检测那些用户可以收到这些消息并把消息传给指定客户端,这种情况下接收客户端并没有提前请求数据而是通过服务器主动推送数据的。当客户端关闭 时,服务端提示其他客户端某客户端已离线。

Socket 套接字连接允许Flash播放器通过指定的端口与服务器通信,socket连接与其他通信技术最大的不是socket连接在数据传输完成后不会自动关闭。
当socket连接创建后,连接会一直保持,直到客户端(Flash播放器)和服务端主动关闭,因此服务器可在任何时间不用客户端请求即可发送数据给客户端。

Flash播放器提供了两种类型的socket连接。一种是早期版本就有的XMLSocket,Flash播放器9增加了二进制socket连接。
使用flash.net.XMLSocket类创建XML数据格式的socket连接,使用flash.net.Socket类创建二进制数据格式socket连接。

XML socket连接以XML数据报交换数据,二进制socket连接是ActionScript 3.0新增的功能,相比之下更低级,但功能很强大,几乎可以连接任意类型的socket服务端程序。例如二进制sockets 可连接邮件服务端程序(POP3, SMTP, 和IMAP), 新闻服务器(NNTP), 聊天室服务器或远程桌面VNC服务器( RFB)。

不管是哪种类型的socket 连接,其通信方式都是异步的,也就是说你不能直接从socket 连接中读取数据,而是通过事件处理函数进行读取处理。
注册事件监听器必须在调用connect( )方法之前,当连接成功时connect事件就会触发,下面的例子演示连接本机2900端口:

package {
import flash.display.Sprite;
import flash.events.*;
import flash.net.Socket;

public class SocketExample extends Sprite {
private var socket:Socket;
public function SocketExample( ) {
socket = new Socket( );
// Add an event listener to be notified when the connection
// is made
socket.addEventListener( Event.CONNECT, onConnect );
// Connect to the server
socket.connect( “localhost”, 2900 );
}
private function onConnect( event:Event ):void {
trace( “The socket is now connected…” );
}

}
}

如果使用XMLSocket,代码也基本上相同,代码如下:

package {
import flash.display.Sprite;
import flash.events.*;
import flash.net.XMLSocket;
public class SocketExample extends Sprite {
private var socket:XMLSocket;

public function SocketExample( ) {
socket = new XMLSocket( );
// Add an event listener to be notified when the connection is made
socket.addEventListener( Event.CONNECT, onConnect );
// Connect to the server
socket.connect( “localhost”, 2900 );
}
private function onConnect( event:Event ):void {
trace( “The xml socket is now connected…” );
}
}
}

如果连接失败,可能的异常有:runtime error,ioError,securityError ,记住,当用socket连接主机时,要遵循Flash Player安全沙漏规则:
swf 和主机必须在同一个域;
网络上的swf不能连接本地服务器;
本地的swf 不能访问任何网络资源;
要 允许域名交叉访问或连接低于1024的端口,需要提供cross-domain 策略文件。如果Socket 或XMLSocket 对象要使用cross-domain 策略文件,可通过方法flash.system.Security.loadPolicyFile( )读取:

Security.loadPolicyFile(“http://www.rightactionscript.com/crossdomain.xml“);
cross-domain策略文件例子:
<?xml version=”1.0”?>
<!DOCTYPE cross-domain-policy SYSTEM “http://www.macromedia.com/xml/dtds/cross-domainpolicy.
dtd”>
<cross-domain-policy>
<allow-access-from domain=”*” to-ports=”80,110″ />
</cross-domain-policy>

发送数据
Socket 和XMLSocket类各自定义了不同的APIs来发送数据,首先看一下Socket的API :当使用Socket对象发送数据时必须先把数据写到缓冲区,Socket类定义了一系列方法用于写数据,每个方法都是写入不同类型的数据,这些方法是 writeBoolean( ), writeByte( ), writeBytes( ),writeDouble( ), writeFloat( ), writeInt( ), writeMultiByte( ), writeObject( ), writeShort( ), write-UnsignedInt( ), writeUTF( ), 和writeUTFBytes( ) 。每个方法都接受一种类型的参数,如writeBoolean( )接受布尔型参数,writeByte( ), writeDouble( ), writeFloat( ), writeInt( ), writeShort( ),和writeUnsignedInt( )接受数字参数,writeObject( )方法接受对象参数,writeBytes( )方法允许传递一个ByteArray类型参数以及偏移量和长度,如下面的写法:

socket.writeBytes(byteArray, 0, byteArray.length);

writeUTF( )和writeUTFBytes( )方法写入字符串,每个方法接受一个字符串参数,writeUTFBytes( )
方法写入字节形式的字符串,writeUTF( )方法写入字节数字。
writeMultiByte( )方法也是写入字符串数据,但可以不使用默认字符集,该方法接受两个参数:
字符串和指定字符集编码,下面的例子写入Unicode编码的字符串:

socket.writeMultiByte(“example”, “unicode”);

利用Socket对象,完全可以用ActionScript写出一个Telnet和POP客户端,这两个协议都是以ASCII
字符为基础的,例如,连接一个POP服务器后,可用下面的代码执行USER命令:
// POP servers expect a newline (\n) to execute the preceding command.
socket.writeUTFBytes(“USER exampleUsername\n”);
写入的数据实际上还没发送到服务器上,每个方法都死把数据累积到Socket对象上,例如下面的
四个代码并没有把数据发送出去:
socket.writeByte(1);
socket.writeByte(5);
socket.writeByte(4);
socket.writeByte(8);
当要发送数据时,必须调用flush( )方法,flush( )方法发送所有的数据并清空缓冲区:
socket.flush( );
XMLSocket类发送数据就比较简单了,发送数据的方法为send( ),send( )方法接受任意类型的数
据类型,它会把参数转换为字符串并发送给服务器,一般这个参数是一个XML对象:
xmlSocket.send(xml);
实际上发送的数据类型是由服务器所决定的,如果服务器接受XML 数据,那必须发送XML 数
据,如果服务器接受URL-编码数据,则必须发送URL-编码数据。

    博视界科技专注于沉浸式全景数字餐厅、全息酒店宴会厅,旨在帮传统餐饮用科技玩跨界,欢迎咨询!

官方网站:www.boseetech.com

联系方式:    

微信联系我:


    【声明】转载本文请注明出处三人行设计,并保留有效链接:socket与flash通信应用 http://www.srxtuan.com/archives/1448,谢谢!

猜您还喜欢: