`
hacker47
  • 浏览: 336467 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

FLEX提高篇---------FMS两种方式实现简易聊天室

阅读更多

原理和代码都很简单,没什么好说的.

 

一:利用ShareObject的同步事件来将消息广播到所有客户端:

 

 

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" backgroundColor="white" layout="vertical" initialize="BasicPracticeSO();">
	<mx:Script>
		<![CDATA[
			private var nc:NetConnection;
			private var shareObject:SharedObject;
			private var monthDay:Date;
			private var isConnectSuccess:Boolean;
			private static const RTMP_URL:String="rtmp://localhost/BasicSO";
			
			
			private function BasicPracticeSO():void{
				nc=new NetConnection;
				nc.connect(RTMP_URL);
				nc.addEventListener(NetStatusEvent.NET_STATUS,operateShareObject);
			}
			
			private function operateShareObject(evt:NetStatusEvent):void{
				isConnectSuccess=(evt.info.code=="NetConnection.Connect.Success");
				if(isConnectSuccess){
					shareObject=SharedObject.getRemote("userInfo",nc.uri,false);
					monthDay=new Date();
					shareObject.connect(nc);
					shareObject.addEventListener(SyncEvent.SYNC,detectSO);
				}
			}
			
			private function detectSO(e:SyncEvent):void{
				for(var chng:uint;chng<e.changeList.length;chng++){
				switch(e.changeList[chng].code){
					case "change":
						updateAllClientMsg();
						break;
					case "clear":
						break;
					case "success":
						break;
					default:
						break;
					}
				}
			}
			
			private function updateAllClientMsg():void{
				soList.text+=shareObject.data.msg+"\n";
			}
		
			
			private function addDataToShareObject():void{
				shareObject.setProperty("msg",msgText.text);
				soList.text+=msgText.text+"\n";
				msgText.text="";
			}
		]]>
	</mx:Script>
	<mx:Label text="ShareObject data:"/>
	<mx:TextArea id="soList" width="300" height="120">
		
	</mx:TextArea>
	<mx:Form>
		<mx:FormHeading label="add data to ShareObject:"/>
		<mx:FormItem label="msg:">
			<mx:TextInput id="msgText"/>
		</mx:FormItem>
		<mx:FormItem>
			<mx:Button label="send Msg" click="addDataToShareObject();"/>
		</mx:FormItem>
	</mx:Form>
</mx:Application>

 

 

二:在FMS服务端通过编码方试广播消息到所有客户端:

 

     1.客户端代码:

     

     

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" backgroundColor="white" layout="vertical" initialize="initAppSO();">
	<mx:Script>
		<![CDATA[
			import com.client.ClientObj;
			private var nc:NetConnection;
			private var shareObject:SharedObject;
			private var monthDay:Date;
			private var isConnectSuccess:Boolean;
			private static const RTMP_URL:String="rtmp://localhost/BasicSO/chat";
			
			
			private function initAppSO():void{
				nc=new NetConnection;
				nc.connect(RTMP_URL);
				var clientObj:ClientObj=new ClientObj(soList);
				nc.client=clientObj;
				nc.addEventListener(NetStatusEvent.NET_STATUS,checkStatus);
			}
			
			private function checkStatus(evt:NetStatusEvent):void{
				isConnectSuccess=(evt.info.code=="NetConnection.Connect.Success");
				if(isConnectSuccess){
					soList.text+="connect success"+"\n";
				}
			}
			
			
			private function addDataToShareObject():void{
				var msg:String=msgText.text;
				var responder:Responder=new Responder(callback);
				nc.call("writeFile",responder,msg);
				msgText.text="";
			}
			
			private function callback(str:String):void{
				// ToDo something
			}
			
		]]>
	</mx:Script>
	<mx:Label text="chating list data:"/>
	<mx:TextArea id="soList" width="300" height="220">
	</mx:TextArea>
	<mx:HBox>
		<mx:Label text="msgText:"/>
		<mx:TextInput id="msgText"/>
		<mx:Button label="send Msg" click="addDataToShareObject();"/>
	</mx:HBox>
</mx:Application>

 

 

2.FMS服务器端代码:

 

这里我把聊天记录写到了服务器端的一个文件里.其实写不写都无所谓.

 

application.onAppStart=function(){
	trace("app is started");
};

application.onConnect=function(client,name){
	client.id=name;
	application.acceptConnection(client);
	var file=new File("chatfile.text");
	
	client.writeFile=function(msg){
		file.open("text","append");
		if(file.isOpen){
			msg=client.id+":"+client.ip+":say:\n"+msg;
			trace(msg);
			file.write(msg);
			file.close();
		}
		//client.call("serverToClient",null,msg);
		for(var i=0;i<application.clients.length;i++){
			application.clients[i].call("serverToClient",null,msg);
		}
	}
};


application.onDisconnect=function(client){
	
	for(var i=0;i<application.clients.length;i++){
		msg=application.clients[i].id+"  left!";
		application.clients[i].call("serverToClient",null,msg);
	}
}

 

5
3
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics