Flash/Flex学习笔记(53):利用FMS快速创建一个文本聊天室

先来看客户端fla的构成:

第一帧:登录界面

第一帧的代码:

import flash.events.MouseEvent;
import com.adobe.utils.StringUtil;
import utils.Alert;

stop();

var userName:String="";

Alert.init(stage);

btnLogin.addEventListener(MouseEvent.CLICK,btnLoginClick);

function btnLoginClick(e:MouseEvent):void{	
	txtUserName.text = StringUtil.trim(txtUserName.text);
	this.userName = txtUserName.text;
	if (this.userName.length<=0){
		Alert.show("请输入用户名!",null,0xefefef,0x000000);
	}
	else{
		gotoAndPlay(2);
	}	
}

第二帧:聊天的主界面

代码:

import flash.net.NetConnection;
import flash.events.MouseEvent;
import flash.events.NetStatusEvent;
import flash.events.KeyboardEvent;
import utils.Alert;
import flash.ui.Keyboard;

stop();

var nc:NetConnection;

function init():void {
	nc = new NetConnection();
	nc.client=new Object();
	//定义供服务端广播消息时需要的客户端函数(结合main.asc查看)
	nc.client.showmsg = function (str:String):void
	{
	txtMsg.appendText(str + "\n");
	};

	nc.addEventListener(NetStatusEvent.NET_STATUS,connHandler);
	nc.connect("rtmp://localhost/chat",userName);//注:这里的userName是在第一帧定义的
	updateMsg("正在连接服务器...");
	btnSend.addEventListener(MouseEvent.CLICK,btnSendClick);

	txtSend.addEventListener(KeyboardEvent.KEY_DOWN,txtSendKeyDown);

}

function txtSendKeyDown(e:KeyboardEvent):void {
	if (e.keyCode == Keyboard.ENTER) {
		btnSendClick(null);
	}
}

function btnSendClick(e:MouseEvent):void {
	txtSend.text = StringUtil.trim(txtSend.text);
	if (txtSend.text != "") {
		nc.call("sendmsg",null,txtSend.text);
		txtSend.text = "";
	}
	else {
		Alert.show("请输入要发送的内容!",null,0xefefef,0x000000);
	}
}

function connHandler(e:NetStatusEvent) {
	switch (e.info.code) {
		case "NetConnection.Connect.Closed" :
			updateMsg("成功关闭连接!");
			break;
		case "NetConnection.Connect.Failed" :
			updateMsg("连接尝试失败!");
			break;
		case "NetConnection.Connect.Success" :
			updateMsg("服务器连接成功!");
			break;
		case "NetConnection.Connect.Rejected" :
			updateMsg("连接尝试没有访问应用程序的权限!");
			break;
		default :
			txtMsg.appendText(e.info.code + "\n");
			break;
	}
}

function updateMsg(msg:String):void {
	txtMsg.appendText(msg + "\n");
}

init();

服务端main.asc的处理(注:main.asc保存时,貌似只能选择为utf-8编码,否则运动时客户端一直连接不上)

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

//新客户端连接时触发
application.onConnect = function(client, uName) {
	trace("onConnect = "+uName);
	client.UserName = uName;
	application.acceptConnection(client);//允许客户登录,如果要对客户身份做验证,在此扩展即可 	
	hellomsg="系统信息:"+client.UserName+" 进入聊天室";
	application.broadcastMsg("showmsg",hellomsg);//调用所有client的showmsg方法,并传递参数hellomsg(客户端的代码中,必须有对应的showmsg函数)
	
	//定义服务端的sendmsg方法,以便客户端能调用
	client.sendmsg = function(msg) {
		mesg = client.UserName+": "+msg;
		//每次client调用本方法后,服务器同步广播到所有client
		application.broadcastMsg("showmsg",mesg)
	};
	
};

//有客户端断开连接时触发
application.onDisconnect = function(client) {
	trace("onDisconnect ="+client.UserName);	
	hellomsg="系统信息:"+client.UserName+" 离开聊天室";
	application.broadcastMsg("showmsg",hellomsg)
};
application.onAppStop = function() {
	trace("onAppStop");
};

运行中的样子:

注:艾睿论坛上曾有一篇教程利用FMS的远程共享对象来创建聊天室,远程对象在编码上也许更简单,不过个人感觉性能不太理想(因为对于共享对象的广播是FMS自动的,完全不受控制,不管客户端想不想接收消息,都会被动接收消息),本文演示的是另一种常见做法(服务端可以有选择性的仅向某些Client发送消息),而且网上也有很多相关文章,只不过要么是收费的,要么是基于AS2.0的,今天用AS3.0整理出来,于已方便、与人方便。

源代码下载:http://cid-2959920b8267aaca.skydrive.live.com/self.aspx/Flash/FMSTxtChatBasicDemo.rar

后话:这个跟silverlight做的聊天室(基于scoket或wcf双工通讯)有什么不同呢? 答:silverlight做聊天室应用,往往需要开发者自己做一个(scoket) server端,而adobe的fms正好充当了这个角色,省去了这一步之后,程序员只需要把注意力集中在客户端和业务逻辑上即可,开发量大大缩减。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

快速体验mongoDB分片

1、mongodb分片的实质是将数据分散到不同的物理机器,以分散IO,提供并发与吞吐量 2、mongodb分片依赖于片键,即任意一个需要开启的集合都需要创建...

17820

访问数据 - 反应方式(Vert.x入门的第4部分)

原文地址:https://dzone.com/articles/accessing-data-the-reactive-way

1.2K40
来自专栏玄魂工作室

Python黑帽编程 4.1 Sniffer(嗅探器)之数据捕获(上)

Python黑帽编程 4.1 Sniffer(嗅探器)之数据捕获(上) 网络嗅探,是监听流经本机网卡数据包的一种技术,嗅探器就是利用这种技术进行数据捕获和分析的...

66170
来自专栏小白安全

Discuz网站通用修改注册会员数和显示在线人数

一.修改在线人数跟会员: 1.找到文件:sourcemoduleforumforum_index.php 2.查找代码: $onlinenum...

37980
来自专栏Linux驱动

第1阶段——uboot分析之硬件初始化start.S(4)

分析uboot第一个执行函数_start(cpu/arm920t/start.S)  打开cpu/arm920t/start.S 1 .globl _start...

27780
来自专栏王二麻子IT技术交流园地

《跟我学IDEA》四、配置模板(提高代码编写效率)

上一篇博文,我们学习了idea的一些实用配置,相信大家也对idea这个开发工具有了一个大概的了解。今天我们来学习模板的配置,idea提供很多模板从而提高编写代码...

97170
来自专栏阿杜的世界

分布式系统学习资料(ing)一、理论知识二、数据库三、分布式服务调用四、消息系统

10720
来自专栏刘望舒

Android系统启动流程(四)Launcher启动过程与系统启动流程

前言 此前的文章我们学习了init进程、Zygote进程和SyetemServer进程的启动过程,这一篇文章我们就来学习Android系统启动流程的最后一步:L...

25780
来自专栏*坤的Blog

公司web安全等级提升

公司的一个web数据展示系统,本来是内网的,而且是一个单独的主机,不存在远程控制的问题,所以之前并没有考虑一些安全相关的测试.但是国调安全检查的需要添加这样子的...

22540
来自专栏一个爱瞎折腾的程序猿

asp.net core使用Swashbuckle.AspNetCore(swagger)生成接口文档

开局一张图,然后开始编,一些基本的asp.net core东西就不再赘述,本文只对Swashbuckle.AspNetCore的几个使用要点进行描述。

18910

扫码关注云+社区

领取腾讯云代金券