基于FMS的AS3聊天室源代码
若要运行此例,请在你的机器上装上FMS3,安装时一切操作都默认,安装成功后在C:\Program Files\Adobe\Flash Media Server 3\applications目录下新建一个文件夹名为talk。
新建一个fla文件,在场景中绘制一个输入文本框,实例名为in_txt,再绘制一个输入文本框,实例名为user_txt,拖入3个按钮组件,参数里的label分别为“清空聊天记录”“查看聊天记录”“发送”,三个按钮的实例名分别为clear_talklist_btn,talklist_btn,send_btn。文档类中填写main。
读者自己可以对界面进行简单的布局。
在同目录下新建一个名为main.as的as文件,在其中输入以下代码:
package {
import flash.display.MovieClip;
import flash.net.NetConnection;
import flash.net.SharedObject;
import flash.events.NetStatusEvent;
import flash.events.SyncEvent;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.text.TextField;
import flash.text.TextFormat;
import fl.controls.TextArea;
import fl.controls.Button;
public class main extends MovieClip {
private var so:SharedObject;
private var so1:SharedObject;
private var nc:NetConnection;
private var mytextformat:TextFormat;
private var outTxt:TextArea;
private var mydate:Date;
public function main():void {
so1=SharedObject.getLocal("myname");
settextformat();//设置文本格式
buildUI();//设计界面
nc=new NetConnection();
setlisteners();
nc.connect("rtmp://localhost/talk");
readlocaldata();//读取本地数据
}
private function readlocaldata():void {
try {
user_txt.text=so1.data.myname;
} catch (error:Error) {
user_txt.text="talker";
//trace("不存在该本地共享对象");
}
}
private function buildUI():void {
//设计界面
outTxt=new TextArea;
outTxt.setSize(350,300);
outTxt.x=10;
outTxt.y=10;
outTxt.editable=false;
outTxt.setStyle("textFormat",mytextformat);
addChild(outTxt);
}
private function settextformat():void {
//设置文本格式
mytextformat=new TextFormat;
mytextformat.size=13;
mytextformat.color=0x0000FF;
}
private function setlisteners():void {
nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
send_btn.addEventListener("click",sendmsg);
user_txt.addEventListener(Event.CHANGE,txtchange);
stage.addEventListener(KeyboardEvent.KEY_UP,keyup);
talklist_btn.addEventListener("click",show_talklist);
clear_talklist_btn.addEventListener("click",clear_talklist);
}
private function clear_talklist(event):void{
so1.data.talklist="";
}
private function show_talklist(event):void{
outTxt.text=so1.data.talklist;
}
private function txtchange(event:Event):void {
//用户名文本文字改变时,用户名数据保存到本地
so1.data.myname=user_txt.text;
so1.flush();
//trace(1);
}
public function netStatusHandler(event:NetStatusEvent):void {
//trace("connected is: " + nc.connected );
//trace("event.info.level: " + event.info.level);
//trace("event.info.code: " + event.info.code);
switch (event.info.code) {
case "NetConnection.Connect.Success" :
//trace("Congratulations! you're connected");
so = SharedObject.getRemote("talk", nc.uri, false);
so.connect(nc);
so.addEventListener(SyncEvent.SYNC, syncHandler);
break;
case "NetConnection.Connect.Rejected" :
case "NetConnection.Connect.Failed" :
trace("Oops! you weren't able to connect");
break;
}
}
private function syncHandler(event:SyncEvent):void {
// when a sync event is fired
// update the position of the ball in clients
try {
if (so.data.message!=undefined) {
outTxt.appendText(so.data.user+" 在 "+so.data.date+" 说:\n"+so.data.message+"\n");
so1.data.talklist+=so.data.user+" 在 "+so.data.date+" 说:\n"+so.data.message+"\n";
outTxt.verticalScrollPosition = outTxt.maxVerticalScrollPosition;
}
} catch (error:Error) {
//
}
}
private function send():void {
if ( so != null ) {
so.setProperty("message", in_txt.text);
so.setProperty("user",user_txt.text);
mydate=new Date;
so.setProperty("date",mydate.getFullYear()+"-"+Number(mydate.getMonth()+1)+"-"+mydate.getDate()+" "+mydate.getHours()+":"+mydate.getMinutes());
in_txt.text="";
}
}
private function keyup(event:KeyboardEvent):void {
if (event.keyCode==13) {
send();
}
}
function sendmsg( event ):void {
// update the shared object when a user moves the ball
// this fires a sync event
send();
}
}
}
好了,Ctrl+Enter就可以看到效果了。
效果图如下: