返回首页

基于Flash Socket的Flash IM 实验概述

时间:2012-02-11 18:23来源:betway必威官网www.etsupport.net 编辑:麦田守望者

初步计划
使用Flash Socket实现用户间的即时类消息推送,即聊天功能;
使用ashx(即一般应用程序)生成xml实现非即时性数据的获取。

服务器端使用.net socket的异步式方法操作,经过对内存和CPU使用率的分析,发现这种方式比较节省资源。

基于Flash Socket的Flash IM 实验概述
IMServer 主要为三个类:
主服务类,负责侦听,维护连接客户端列表;
客户端类,负责发送接收消息;
分析处理类:静态类,负责分析消息语义,实现用户间聊天,和命令功能实现。

 

Flash 测试端类:

package IM
{
import flash.utils.ByteArray;
import flash.display.Sprite;
import flash.events.*;
import flash.net.Socket;
import flash.net.XMLSocket;

import flash.utils.Timer;
import flash.events.TimerEvent;

public class IM_Client extends Sprite
{
private var _User:String;
private var _HostName:String;
private var _HostPort:uint;
private var _Socket:Socket;
private var _Timer:uint=0;

public var Recv:String="";
public var IsAlive:Boolean=false;

public function IM_Client(user:String="",host:String="10.1.4.28",port:uint=8888)
{
_User=user;
_HostName=host;
_HostPort=port;

_Socket = new Socket();

_Socket.addEventListener(Event.CLOSE, onClose);
_Socket.addEventListener(Event.CONNECT, onConnect);
_Socket.addEventListener(ProgressEvent.SOCKET_DATA,onRecv);

_Socket.addEventListener(DataEvent.DATA, onDataEvent);
_Socket.addEventListener(ProgressEvent.PROGRESS, onProgress);
_Socket.addEventListener(IOErrorEvent.IO_ERROR, onIoError);
_Socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
}

//打开服务器连接
public function Open(user:String="",host:String="",port:String=""):void
{
if(user!="") _User=user;
if(host!="") _HostName = host;
if(port!="") _HostPort = parseInt(port);

IsAlive=false;

try{
_Socket.connect(_HostName, _HostPort);
//6秒没有连接上则视为失败
var timer:Timer = new Timer(6000,1);
timer.addEventListener(TimerEvent.TIMER,onTimerConnFail);
timer.start();
}catch(e){
onTimerConnFail(null);
trace("Error ");
}
}

//发送普通消息
public function Send(strTo:String,data:String):void
{
if(!IsAlive) return;

if (_User==""||strTo==""||data=="")
{
return;
}

var strSend:String=IM_Type.STREAM_HEADER
+IM_Type.STREAM_SEPARATE
+_User
+IM_Type.STREAM_SEPARATE
+strTo
+IM_Type.STREAM_SEPARATE
+data;

_Socket.writeUTFBytes(strSend);
_Socket.flush();
}

//发送命令消息
public function SendCMD(cmd:String):void
{
if(!IsAlive) return;

var strSend:String=IM_Type.STREAM_HEADER
+ cmd
+ IM_Type.STREAM_SEPARATE
+ _User
+ IM_Type.STREAM_SEPARATE
+ _User
+ IM_Type.STREAM_SEPARATE;

_Socket.writeUTFBytes(strSend);
_Socket.flush();
}

//关闭IM连接
public function Close():void
{
IsAlive=false;

SendCMD(IM_Type.CLIENT_DISCONN);
_Socket.close();
}

private function onRecv(e:ProgressEvent):void
{
var string:String="";
while(_Socket.bytesAvailable){
string += _Socket.readUTFBytes(_Socket.bytesAvailable);
}
Recv=string;

//第一次连接时,发送连接成功标志,注册身份
if(!IsAlive){
//1秒后发送连接成功标志
var timer:Timer=new Timer(1000,1);
timer.addEventListener(TimerEvent.TIMER,onTimerConn);
timer.start();
}

dispatchEvent(new Event(IM_Type.EVENT_RECV));
}

//连接成功|即接收到授权文件后,需要一段时间再发送连接成功
private function onTimerConn(e:TimerEvent):void{
IsAlive=true;
SendCMD(IM_Type.CLIENT_CONNECT);
dispatchEvent(new Event(IM_Type.EVENT_CONN));

trace(IM_Type.EVENT_CONN);
}

//连接超时失败
private function onTimerConnFail(e:TimerEvent):void{
//如果连接成功则返回
if(IsAlive) return;
dispatchEvent(new Event(IM_Type.EVENT_CONN_FAIL));

trace(IM_Type.EVENT_CONN_FAIL);
}

private function onConnect(event:Event):void
{
trace("onConnect: " + event);
}

private function onClose(event:Event):void
{
trace("onClose: " + event);
}

private function onDataEvent(event:DataEvent):void
{
trace("onData: " + event);

dispatchEvent(event);
}

private function onProgress(event:ProgressEvent):void
{
trace("onProgress loaded:" + event.bytesLoaded + " total: " + event.bytesTotal);

dispatchEvent(event);
}

private function onIoError(event:IOErrorEvent):void
{
trace("onIoError: " + event);

dispatchEvent(event);
}

private function onSecurityError(event:SecurityErrorEvent):void
{
trace("onSecurityError: " + event);

dispatchEvent(event);
}
}
}

顶一下
(1)
100%
踩一下
(0)
0%
标签(Tag):FLASH FLASH实例教程 flash技巧 flash教程 flash代码
------分隔线----------------------------
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片