今天我们的讲解的是在昨天代码的功能上加上在线列表的功能,同时会去掉共享对象,用另一种方法向客户端发消息.
先看看服务端代码我们更改些什么代码:
application.onAppStart = function() {
this.chatMsgArray = new Array();
this.userListArray = new Array();
}
application.onConnect = function(client, userName) {
if(checkOnline(userName)){
this.rejectConnection(client);
return;
}
this.acceptConnection(client);
client.userName = userName;
this.userListArray.push(userName);
sendUserList();
//客户端调用方法
client.getMsg = function(){
return application.chatMsgArray;
}
client.sendMsg = function(msg){
var chatInfo = this.userName + " : " + msg;
application.chatMsgArray.push(chatInfo);
sendMsgToClient(chatInfo);
}
}
application.onDisconnect = function(client) {
trace("用户:"+client.userName+" 离开");
var len = this.userListArray.length;
for(var i=0;i<len;i++){
if(this.userListArray[i] == client.userName){
this.userListArray.splice(i,1);
sendUserList();
}
}
}
application.onAppStop = function() {
delete this.chatMsg_so;
}
function checkOnline(userName){
var len = application.userListArray.length;
for(var i=0;i<len;i++){
if(application.userListArray[i] == userName){
return true;
}
}
return false;
}
function sendMsgToClient(chatInfo){
var len = application.clients.length;
for(var i=0;i<len;i++){
application.clients[i].call("getMsgInfo",null,chatInfo);
}
}
function sendUserList(){
var len = application.clients.length;
for(var i=0;i<len;i++){
application.clients[i].call("getUserList",null,application.userListArray);
}
}
this.chatMsgArray = new Array();
this.userListArray = new Array();
这两个定义的数组是在开始定义的,chatMsgArray是存储所有的聊天信息,userListArray是一个存储在线列表的数组
当用户连接进来的时候,我们用了一个函数checkOnline来检查用户是不是在在线列表中,如果在就用this.rejectConnection(client);拒绝这个连接,如果不在就接受这个连接并加到在线列表中
sendUserList函数是向所以客户端发送在线列表信息,application.clients是一个存储所以客户端连接的信息,application.clients.call就是调用客户端函数,使用方法跟客户端调服务器端是一样的.
然后我们增加了1个供客户端调用的函数
client.getMsg = function(){
return application.chatMsgArray;
}
client.getMsg是返回所有的聊天信息,当用户第一次连接时,得到别人的聊天记录
在用户断开连接的时候增加了将断线用户从在线列表中清除,并且发送在线列表.
再来看看客户端代码:
package net.smilecn.chat{
import flash.display.Sprite;
import flash.net.NetConnection;
import flash.net.Responder;
import flash.events.NetStatusEvent;
import flash.events.SyncEvent;
import flash.events.MouseEvent;
import fl.controls.TextArea;
import fl.controls.Button;
import fl.controls.TextInput;
import fl.controls.Label;
import fl.controls.List;
import fl.data.DataProvider;
public class Chat extends Sprite{
private var nc:NetConnection;
private var rtmpUrl:String = "rtmp://localhost/chat";
private var msg:Label;
private var userNameInput:TextInput;
private var enterBtn:Button;
private var button:Button;
private var textArea:TextArea;
private var textInput:TextInput;
private var userList:List;
private var userName:String = "user002";
public function Chat():void{
userNameInput = new TextInput();
userNameInput.move(100,200);
addChild(userNameInput);
enterBtn = new Button();
enterBtn.move(220,200);
enterBtn.label = "进入";
addChild(enterBtn);
enterBtn.addEventListener(MouseEvent.CLICK,enterBtnClickHandler);
msg = new Label();
msg.move(100,230);
msg.text = "";
addChild(msg);
}
private function enterBtnClickHandler(event:MouseEvent):void{
if(userNameInput.text!=""){
userName = userNameInput.text;
removeChild(userNameInput);
removeChild(enterBtn);
removeChild(msg);
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);
userList = new List();
userList.move(250,20);
userList.setSize(100,300);
addChild(userList);
nc=new NetConnection();
nc.addEventListener (NetStatusEvent.NET_STATUS,netStatusHandler);
nc.connect (rtmpUrl,userName);
nc.client = this;
}else{
msg.text = "请输入用户名";
}
}
private function netStatusHandler(event:NetStatusEvent):void{
trace("event.info.code:",event.info.code);
if(event.info.code == "NetConnection.Connect.Success"){
nc.call("getMsg",new Responder(getMsgResult,getMsgFault))
}
}
private function getMsgResult(re:Array):void{
var s:String="";
var len:Number = re.length;
for(var i=0;i<len;i++){
s += re[i]+" ";
}
textArea.text = s;
}
private function getMsgFault(fe:*):void{
trace(fe);
}
private function sendMsg (e:MouseEvent):void{
nc.call("sendMsg",null,textInput.text);
textInput.text = "";
}
public function getMsgInfo(msg:String):void{
textArea.appendText(msg+" ");
}
public function getUserList(list:Array):void{
userList.dataProvider = new DataProvider(list);
}
}
}
客户端首先增加了一个用户输入名字,这是些简单的代码.
然后共享对象的那部份去掉了,加了句这样的代码:nc.client = this;
这句话的意思是指定当前对象为服务器回调方法的对象
public function getMsgInfo(msg:String):void{
textArea.appendText(msg+"\n");
}
public function getUserList(list:Array):void{
userList.dataProvider = new DataProvider(list);
}
这两个方法就是服务器调用的方法.
在nc连接成功的地方加了句nc.call(”getMsg”,new Responder(getMsgResult,getMsgFault)),这句是在刚连接成功的时候得到以前用户的聊天记录.
顺便说一句,客户端代码用到了组件,所以要把这些组件放到库中才能运行,上一节也是这样的.
下节继续.
(本教程如需转载请注明出处!)
分享到:
相关推荐
FMS4.5( Adobe Flash Media Server4.5)流媒体服务器搭建 支持rtmp推送与浏览
flash media server 4 帮助文档 Server-Side ActionScript is Adobe’s name for JavaScript 1.5. Flash Media Server has an embedded Java-Script engine that compiles and executes server-side scripts. This ...
flash media server 5.0.14(ADOBE FMS5.0)64bit for win 视频服务器软件2017年11月最新版,因文件限制,已拆开两个文件,part1和part2,要2个一起下可用。
FMS开发Flash Media Server 入门教程 我把我以前的那些FMS学习笔记整理了一下,做了下修改,成了一页的FMS教程,方便想学FMS的新手来看,如果还有错误或者看不懂的地方欢迎留言,或email偶,偶会进行更改 什么是...
flash media server 2下载 无限制序列号
FMS4.0实现流媒体服务器的配置,包含FMS的配置说明,FMS4.0和3.5注册机,另附带RTMP视频测试播放工具。360可能会提示危险,请放心,绝对无毒。 亲测可用。因为上传大小的限制 没有FMS软件 如有需要 请联系作者
fms用的flash播放器 放在服务器下执行
fsm(3.5)服务器是用于用户之间相互通讯的新平台,它集成了Flash多媒体交互的特性,又添加了实时音频和实时数据流等新特色.fms开发文档(3.5版),对学习开发flash media server的人有很大帮助。
FLASH MEDIA SERVER4.5注册机,FMS 4.5注册机
仅供fms编程爱好者学习和研究使用,不得用于任何商业用途。
FMS3中文帮助 1.起步 2.流服务 3.开发媒体应用程序 4.开发实况视频应用程序 5.开发社交的媒体程序
Flash Media Server 3技术指南_part2.pdf 安装Flash Media Server 2.pdf 服务器端ActionScript语言参考.pdf 服务器管理ActionScript字典.pdf 管理Flash Media Server.pdf 开发媒体应用程序.pdf 客户机端ActionScript...
flash media server 5.0.14(ADOBE FMS5.0)64bit for win 视频服务器软件2017年11月最新版,因文件限制,已拆开两个文件,part1和part2,要2个一起下可用。
Flash Media Server 4.5(fms4.5)教程一:安装使用说明
陈冰 翻译 flash media server2 <<Developing media appliactions>>
Flash media server(原名Flash Communication Server)自带的资料都是英文版的,对于许多的读者来说,阅读起来很不方便,这一份中文版的翻译,真不错,可惜只有一部分,但是对于学习FMS入门绝对是一份很好的教材
管理Flash Media Server
简而言之,Adobe的FMS是一个多媒体应用平台,在这个平台上,可以实现多媒体流的点播、直播、交互等多种应用
Flash Media Server3 技术指南,有关FMS服务器的部署等配置