今天我們講一個非常簡單的多人聊天功能,同樣我們也沒有服務端代碼,今天要用到一個新東西----SharedObject
先看一段代碼,更改一下上一節中的代碼:
package net.smilecn.chat{
import flash.display.Sprite;
import flash.net.NetConnection;
import flash.net.SharedObject;
import flash.events.NetStatusEvent;
import flash.events.SyncEvent;
import flash.events.MouseEvent;
import fl.controls.TextArea;
import fl.controls.Button;
import fl.controls.TextInput;
public class Chat extends Sprite{
private var nc:NetConnection;
private var rtmpUrl:String = "rtmp://localhost/chat";
private var button:Button;
private var textArea:TextArea;
private var textInput:TextInput;
private var chatMsg_so:SharedObject;
private var userName:String = "user001";
public function Chat():void{
textArea=new TextArea();
textArea.setSize (200,300);
textArea.move (20,20);
addChild (textArea);
textInput=new TextInput();
textInput.width = 140;
textInput.move (20,330);
addChild (textInput);
button=new Button();
button.width=50;
button.label="發送";
button.move (170,330);
addChild(button);
button.addEventListener (MouseEvent.CLICK,sendMsg);
nc=new NetConnection();
nc.addEventListener (NetStatusEvent.NET_STATUS,netStatusHandler);
nc.connect (rtmpUrl);
}
private function netStatusHandler(event:NetStatusEvent):void{
if(event.info.code == "NetConnection.Connect.Success"){
chatMsg_so=SharedObject.getRemote("chatMsg",nc.uri,false);
chatMsg_so.connect (nc);
chatMsg_so.addEventListener (SyncEvent.SYNC,checkSO);
}
}
private function checkSO (event:SyncEvent):void{
for (var i:uint; i<event.changeList.length; i++)
{
switch (event.changeList[i].code)
{
case "clear" :
trace("clear");
break;
case "success" :
trace (chatMsg_so.data.msg);
break;
case "change" :
textArea.appendText (chatMsg_so.data.msg + " ");
break;
}
}
}
private function sendMsg (e:MouseEvent):void{
chatMsg_so.setProperty ("msg",userName + ":" + textInput.text);
textArea.appendText (userName + ":" + textInput.text + " ");
textInput.text = "";
}
}
}
要看到效果,我們先了布一份EXE的檔案,相當一個用戶端,然後把userName改一個名字,前一個是user001,這個我們就改成user002,將那個EXE開啟,再將FLASH裡的這個發布,試著打上文字點發布,看看是不是達到了聊天的效果.
接下來來講解一下代碼:
在串連成功之後,有這樣一句代碼:chatMsg_so=SharedObject.getRemote("chatMsg",nc.uri,false);
chatMsg_so是我們定義的一個SharedObject執行個體,SharedObject--共用對象,官方的解釋是這樣的:
SharedObject 類用於在使用者電腦或伺服器上讀取和儲存有限的資料量。 使用共用對象,可在永久貯存在本機電腦或遠程伺服器上的多個用戶端 SWF 檔案和對象之間實現即時資料共用。 本地共用對象類似於瀏覽器 Cookie,遠程共用對象類似於即時資料傳輸裝置。
SharedObject可以用來儲存資料,這裡我們用到它是儲存我們的聊天資料.
getRemote方法是得到一個遠程共用對象,就是FMS上的一個共用對象,名字叫chatMsg,地址是nc.uri,最後一個參數是是否以檔案的形式儲存下來,false表示不儲存,當伺服器上有這樣一個名為chatMsg的共用對象時,這個方法就會得到這個共用對象,如果沒有這相共用對象,就會建立一個名為chatMsg的共用對象.
我們的代碼中,第一個客戶連進去後會建立一個共用對象,其它使用者再進去,就是得到這個共用對象.
chatMsg_so.addEventListener (SyncEvent.SYNC,checkSO);
這句代碼是偵聽共用對象的狀態
event.changeList[i].code就是狀態,這裡我們用了三個狀態----clear,success,change
clear是清除資料時(我們的代碼中第一個人進去時會觸發)
success是成功(我們的代碼中自己發訊息時會觸發)
change是改變(我們的代碼中別人發訊息時會觸發)
我們實現這個聊天功能實際是每個人去改變這個共用對象,然後共用對象改變了就會通知所有的用戶端,其它人就會收到這個訊息(注意自己不會收到change訊息).
這個聊天在實際中用處不大,這裡只是介紹共用對象的一個使用方式,而且這種聊天還有很多功能都沒有實現.(本人不喜歡用共用對象)
在後面我們會講解怎麼寫服務端代碼,這兩節都沒有寫服務端代碼.下節繼續.
轉載:http://blog.csdn.net/arrowyoung/article/details/2421965