怎么用As3连接服务器操作?

怎么用As3连接服务器操作?,第1张

socket使用的例子,开源聊天室: http://code.google.com/p/as3chat/

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 的一些简单的例子


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/225064.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-08
下一篇2023-04-08

发表评论

登录后才能评论

评论列表(0条)

    保存