SocketConnection.as:
package org.myleft.core
{
import flash.system.Security
import flash.events.Event
import flash.events.EventDispatcher
import flash.events.IEventDispatcher
import flash.events.IOErrorEvent
import flash.events.ProgressEvent
import flash.events.SecurityErrorEvent
import flash.events.TimerEvent
import flash.net.Socket
import flash.utils.ByteArray
import flash.utils.Timer
import flash.xml.XMLDocument
import flash.xml.XMLNode
import org.myleft.data.Define
import org.myleft.events.SocketConnectionEvent
public class SocketConnection extends EventDispatcher
{
public var socket:Socket
public var host:String
public var port:int
public var keepAlive:Timer
private var lastSendTime:Number
public function SocketConnection(target:IEventDispatcher=null)
{
super(target)
socket = new Socket
socket.addEventListener(Event.CONNECT, socketEventFunction)
socket.addEventListener(Event.CLOSE, socketEventFunction)
socket.addEventListener(Event.ACTIVATE, socketEventFunction)
socket.addEventListener(IOErrorEvent.IO_ERROR, socketIOErrorEventFunction)
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, socketSecurityErrorEventFunction)
socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataFunction)
keepAlive = new Timer(10000)
keepAlive.addEventListener(TimerEvent.TIMER, onKeepAliveLoop)
}
private function onKeepAliveLoop(evt:TimerEvent):void
{
//if((new Date().getTime() - lastSendTime >15000))
if ( socket.connected ) {
this.sendKeepAlive()
}
else
{
keepAlive.stop()
var e:SocketConnectionEvent
e = new SocketConnectionEvent(Define.CLOSE)
dispatchEvent( e )
}
}
public function connect(host:String, port:int):void
{
Security.loadPolicyFile("xmlsocket://"+host+":"+port.toString())
this.host = host
this.port = port
socket.connect(this.host, this.port)
}
public function disconnect():void
{
keepAlive.stop()
socket.close()
}
public function send( message:String ):void
{
trace('send', message)
socket.writeUTFBytes(message)
socket.flush()
}
public function sendKeepAlive():void
{
this.send("<ping/>")
}
private function socketEventFunction(event:Event):void
{
trace("socketEventFunction", event.type)
var e:SocketConnectionEvent
switch (event.type)
{
case Event.CONNECT:
//this.send(Event.CONNECT)
e = new SocketConnectionEvent(Define.CONNECT)
keepAlive.start()
break
case Event.CLOSE:
//this.send(Event.CONNECT)
e = new SocketConnectionEvent(Define.CLOSE)
keepAlive.stop()
break
case Event.ACTIVATE:
e = new SocketConnectionEvent(Define.ACTIVATE)
break
default:
e = new SocketConnectionEvent(Define.NODEFINE)
}
//dispatchEvent( new Event(Event.CONNECT) )
dispatchEvent( e )
}
private function socketIOErrorEventFunction(event:IOErrorEvent):void
{
var e:SocketConnectionEvent
e = new SocketConnectionEvent(Define.CLOSE)
dispatchEvent( e )
}
private function socketSecurityErrorEventFunction(event:SecurityErrorEvent):void
{
var e:SocketConnectionEvent
e = new SocketConnectionEvent(Define.CLOSE)
dispatchEvent( e )
}
private function socketDataFunction(e:ProgressEvent):void
{
var bytedata:ByteArray = new ByteArray()
socket.readBytes( bytedata )
parseDataReceived(bytedata)
}
private function parseDataReceived( bytedata:ByteArray ):void
{
bytedata.position = 0
var data:String = bytedata.readUTFBytes( bytedata.length )
trace('parseData:', data)
var xmlData:XMLDocument = new XMLDocument()
xmlData.ignoreWhite = true
var xml:XMLList
try
{
//xml = new XML(rawXML)
var isComplete: Boolean = true
xmlData.parseXML( data )
var len:uint = xmlData.childNodes.length
for (var i:int = 0i <len++i)
{
// Read the data and send it to the appropriate parser
var currentNode:XMLNode = xmlData.childNodes[i]
trace('currentNode', currentNode.toString())
handleNodeType(currentNode)
}
}
catch (err:Error)
{
trace(err.toString())
}
}
private function handleNodeType(node:XMLNode):void
{
var nodeName:String = node.nodeName.toLowerCase()
var e:SocketConnectionEvent
trace('nodeName:', nodeName)
e = new SocketConnectionEvent(node.attributes.type)
e.body = node
dispatchEvent( e )
}
}
}
随着Flash Player 9的普及,AS3编程也越来越多了,所以这次重新整理AS3下几种与后台数据交换方法。1.URLLoader(URLStream)
2.FlashRemoting
3.XMLSocket(Socket)
4.FMS/FCS
AS3 中使用URLRequest 和URLLoader 与服务器交互AS3 中使用 URLLoader 与 URLRequest 取代了先前版本 LoadVars 方法. 初学者可能又会迷糊了.在现在帮助系统没有完善的情况下 (Flash 9 没有帮助, Flex Builder 2 的只有英文), 这里写篇简单的教程, 方便大家往 AS3 过渡.在AS3 中, 有关于网络操作的内置类全部在 flash.net 里. 下面是本教程要用到的类的清单 :URLLoader : 用于从网络或者本地读取文件, 可以通过设置他的 dataFormat 属性改变收到的文本类型.与AS2 的 LoadVars 不同的是, 他的默认值 URLLoaderDataFormat.TEXT 即纯文本格式, 所以在读取外部文本变量的时候得修改一下他的 dataFormat 为URLLoaderDataFormat.VARIABLES. 不过在 AS2 中没有该属性, 取代的是contentType 属性.URLRequest : 用于传递变量到服务器, 以及 URLLoader 要 load 的目标路径. 可以通过设置他的 contentType 属性改变发送到服务器的变量类型, 默认是 application/x-form-urlencoding, 也就是 URLEncode 编码.URLVariables : 用于配置传递到服务器变量的键 / 值集合, 如user1=Kakera&user2=Eigo.URLLoaderDataFormat : 用于设置 URLLoader 读取文件的类型, 有 TEXT (纯文本), VARIABLES (URLEncoding 的键 / 值集合), BINARY (2 进制格式), URLLoader 会根据相应的类型进行解码操作, 如解码 URLEncode同时还有其他不常用的 :URLRequestMethod : 决定使用哪种方式传递数据到服务器, POST 或者 GET.URLReqeustHeader : 用于配置传递到服务端的 HTTP 标头.值得一提的是, URLLoader 还有相当完整的事件让我们来获取读取数据的状态, 下面是有关 URLLoader 事件的清单.complete : 使用 URLLoader.load() 方法后, 数据完全加载完毕时触发, 通常如果能够触发这个事件的话, 说明你的程序没有问题.httpStatus : 使用 URLLoader.load() 方法后, 获取 HTTP 状态代码时触发, 通过判断他的 state 属性我们可以获得远程文件的加载状态. 成功 (200), 没有权限 (403), 找不到文件 (404), 服务器内部错误 (500) 等等. 这个事件总是在 compelete 之前被触发.ioError : 使用 URLLoader.load() 方法时, 发生致命错误时触发, 我还没碰到过..open : 使用 URLLoader.load() 方法后, 开始从服务器下载数据时触发一次, 此时的 URLLoader.bytesLoaded 一定是 0.progress : 使用 URLLoader.load() 方法后, 在从服务器下载数据的过程中持续触发, 通过侦听他的变化我们可以很方便的为 URLLoader 做加载状态的显示.securityError : FlashPlayer 的安全错误, 比如跨域加载, 从硬盘 (文件系统) 发送 / 读取服务器上的数据.关于注册侦听器的建议flashplayer 内置类的所有事件都有相关事件类常量来表示, 推荐使用他们来注册事件侦听器. 而所有的内置类的事件类 (Event) 全部在 flash.events 包中,如使用:import flash.events.EventurlLoaderInstance.addEventListener(Event.COMPLETE, completeHandler)来代替urlLoaderInstance.addEventListener("complete", completeHandler)下面是 URLLoader 支持的事件所对应类的清单, 他们可以在 Flex Builder 2 的文档中找到:complete : Event.COMPLETEhttpStatus : HTTPStatusEvent.HTTP_STATUSioError : IOErrorEvent.IO_ERRORopen : Event.OPENprogress : ProgressEvent.PROGRESSsecurityError : SecurityErrorEvent.SECURITY_ERROR然后下面是使用 URLLoader 的一些简单的例子欢迎分享,转载请注明来源:夏雨云
评论列表(0条)