帮助文档中的一些代码段:
import flash.errors.*;
import flash.events.*;
import flash.net.Socket;
class CustomSocket extends Socket {
public function CustomSocket(host:String = null, port:uint = 0) {
super(host, port);
configureListeners();
}
private function configureListeners():void {
addEventListener(Event.CLOSE, closeHandler);
addEventListener(Event.CONNECT, connectHandler);
addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
}
private function closeHandler(event:Event):void {
trace("closeHandler: " + event);
}
private function connectHandler(event:Event):void {
trace("connectHandler: " + event);
}
private function ioErrorHandler(event:IOErrorEvent):void {
trace("ioErrorHandler: " + event);
}
private function securityErrorHandler(event:SecurityErrorEvent):void {
trace("securityErrorHandler: " + event);
}
private function socketDataHandler(event:ProgressEvent):void {
trace("socketDataHandler: " + event);
}
}
从上面的Socket对象中,我们可以看到都用到的事件类型;
但目前我们都有一个需求:当目前主机的地址无效、或是链接不上目标时,以上的所有事件,都不会触发;
而一般,我们用其它语言使用的Socket,通常都会有返回:目标主机地址无效,或是目标主机主动断开链接之后的描述;而AS3中的Socket是没有的;
这时我们需要自己去写个TimeOut(超时)处理;
在本地的AS3客户端的Socket对象调用,conect(host,port)之后,我们就应该要做一个超时的判断处理;
直到,触发了,connected或是error事件时,再关闭超时判断;
ef:
socket.connect("xxxx.xxx.xxx.xxx",8888);
//and now,start timeout handler
var isResponsed:Boolean=false;
var timeoutMs:int=10000;//设置为10s的超时判断
var setTimeoutHandlerId:int=setTimeOut(function():void{
if(!isResponsed){
throw new Error("Connection timeout!");
}
},timeoutMs);
function setReponsedHandler(event:Event):void{
isResponsed=true;
cleanTimeOut(setTimeoutHandlerId);
}
socket.addEventListener(Event.CONNECT,setReponsedHandler);
socket.addEventListener(IOErrorEvent.IO_ERROR,setReponsedHandler);
socket.addEventListener(Event.SecurityErrorEvent,setReponsedHandler);