加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

FLASH CS4 + PHP 开发一个FLASH简易聊天室

发布时间:2020-12-15 18:47:25 所属栏目:百科 来源:网络整理
导读:http://www.51xflash.com/article/flashcs3/200910/31-11080.html 这次我打算写一个新的系列教程,就是用 FLASH ?CS4 + PHP 开发一个简易的 FLASH 聊天室(可以点击图片看看),也可以说成是留言板的扩展版本,大家如果认真的看的话,可以学到, FLASH 是如何与PHP


http://www.51xflash.com/article/flashcs3/200910/31-11080.html

这次我打算写一个新的系列教程,就是用FLASH?CS4 + PHP 开发一个简易的FLASH聊天室(可以点击图片看看),也可以说成是留言板的扩展版本,大家如果认真的看的话,可以学到,FLASH是如何与PHP通信,然后再得到返回的数据,mysql输出XML数据等一些技巧.
??????在开始之前,我先把整体思路说一下,今天第一篇,不往深了讲,只说FLASH是如何与PHP通信的,只要理解了这点,再往下面讲就简单了很多.具体的制作简易聊天室思路会在下一篇详细说明.
??????那么FLASH是怎么样与PHP通信的呢?
??????首先我们先把PHP端的代码写好,如下:

<?php
$m = $_GET['messages'];
echo $m;
?>

?????? 并把这个PHP文件命名为 message.php,然后你测试下,输入路径,然后最后加上:? ?messages=hello;看看页面是否显示,OK,如果显示出:hello,那说明PHP端的文件搞定了,
?????? 下一步我们详细说明 FLASH端的代码.我把这些个步骤形容为:三板斧。
??????? 第一板斧:点击

?????? 简单的很,只要在 FLASH舞台上放个BUTTON,然后命名为: send_btn.然后在主AS里,先写上第一行代码,主要是监听点击事件。
??????
send_btn.addEventListener(MouseEvent.CLICK,btnClick);
function btnClick(e:MouseEvent):void{
??sendMessage();
}

?????? 这就是第一板斧,很简单,那么你肯定会问,为什么不把发送的代码全写在 btnClick构造函数里呢,而是另放在 sendMessage()这个构造函数里,其实这是为了代码方便,也是为了下一步有用。

??????? 第二板斧:发送
?????? 顾名思义,就是把 FLASH里的内容发送给PHP,这个代码如下:
??????
function sendMessage():void {
?? //定义PHP文件地址
??var phpFile:String="http://localhost/flashChatroom/message.php";

??var variables:URLVariables = new URLVariables();
??variables.messages="hello";

??var urlRequest:URLRequest=new URLRequest(phpFile);
??//可选,不过为了数据安全建议用上,然后把PHP端的$m = $_GET['messages'];
??//修改为 $m = $_POST['messages'];即可
??urlRequest.method=URLRequestMethod.POST;
??urlRequest.data=variables;


??var urlLoader:URLLoader = new URLLoader();
??urlLoader.addEventListener(Event.COMPLETE,getMessage);
??urlLoader.load(urlRequest);
}


第三板斧:接受
???? 这个就简单了,目前我们只用 trace();命令来接收数据,代码如下:
function getMessage(e:Event):void {
??trace(e.target.data);
}

?????

??????总结,看了这三板斧,大概明白了吧,怎么让 FLASH?与 PHP 通信,不过目前只是讲个最初的概念,不过别看这么简单,后期的程序都是以此框架展开的。特别是第三板斧,因为根据数据不同,格式不同,接收的方法也会不一样,里面有很多文章可做。所以等第二篇吧,明天应该可以写出来了。?
理解了 FLASH与PHP的通信后,下一步就是按照这三板斧,丰富程序。那么先说一下制作聊天是大概思路:
???????
?????? 所谓聊天室,我就把他比喻成一个箱子,你一言,我一句的全部扔在这个箱子里,那么我们大家只要关注这个箱子的情况就可以了。也就是说,我们每个人的客户端,发送的是我们自己的信息,收到的是箱子的整体情况。当然这里面肯定有些小问题,但是我们暂时不管。
?????? 那么如何来发送呢,这就是需要用PHP和MYSQL数据库了,发送:只要把 FLASH发送的信息到PHP,然后用PHP把数据记录到数据库就可以,这比较简单;接收:就是需要PHP从数据库读取数据,然后返还给 FLASH,我们这里可以用PHP读取数据,然后生成XML,让 FLASH读取XML就可以,这也是目前比较流行的做法。

?????? 按照三板斧概念,就可以这么说:
?????? 第一板斧:设置,点击。
?????? 第二板斧:把自己客户端口的信息发送到聊天室箱子。
?????? 第三板斧:用自己客户端读取程序把聊天室箱子里的信息读过来,并且设置一个时间函数,大概每5秒从聊天室箱子读取一次,保持数据更新。
?????? OK,思路理清,我们就开始制作了。

?????? ?首先第一板斧:设置、点击
?????? 我们首先设置聊天室箱子,有了箱子,我们才好做这个客户端口的东西。
??????装上PHP,打开PhpMyAdmin,加入新的数据库:flashchat,同时新建一个数据表格:chats,设置为4行,分别是:id(编号),username(用户名),message(信息),dateAdd(信息添加时间,这个后面说),id为主键。sql代码如下:
CREATE TABLE `chats` (
??`id` int(10) NOT NULL auto_increment,
??`username` varchar(255) NOT NULL,
??`message` text NOT NULL,
??`dateAdd` int(11) NOT NULL default '0',
??PRIMARY KEY??(`id`)
) ENGINE=InnoDB??DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;


??????
?????? 数据设置完毕,下面就是开始写PHP端口的程序了,我们分成两部,第一部分是发送信息到数据库的 sendMessage.php,第二部分是从数据库得到数据的 getMessage.php
?????? 不过在开始前,我们还需要制作一个connection.php,就是连接数据库的。代码为:
??????
<?php
?????????????? $dbconnect=mysql_connect("服务器","用户","密码");,
?????????????? //比如:$dbconnect=mysql_connect("localhost","root","12345");
????????????????if($dbconnect){
????????????????????die("连接问题" . mysql_error());
???????????? }
???????????? mysql_select_db("数据库",$dbconnect);
????????????//比如:mysql_select_db("flashchat",$dbconnect);
?>

????????保存为 connection.php

?????? 开始来制作 sendMessage.php,代码为:
????
<?php
????????????????????include "connection.php";
???????????????????? //$_POST里面的参数,就是 FLASH那端发送过来的参数,你应该还记得上一篇的教程。
????????????????????//这里就是把参数放到两个变量
????????????????????$username = $_POST['userN'];
????????????????????$message = $_POST['msg'];
????????????????????$date = time();
????????????????????
????????????????????//把得到的两个变量存入数据库
????????????????????mysql_query("INSERT INTO chats (username,message,dateAdd)
????????????????????????????????????????VALUES ('$username','$message','$date')
?????????????????????????????????????? ");
???????????????????
?>


?????? 制作? getMessage.php,也就是用PHP从MYSQL读取数据,然后到处XML格式,再让 FLASH来读取,代码为:
??????
<?php
??????????????????include "connection.php";
??????????????????$sql = "SELECT * FROM chats";
??????????????????//其实上面这段是有问题的,你想每个人从聊天室箱子里读取数据,都是全部数据,
??????????????????//这可不是好事,所以我们加了个dateAdd的用意就在这里,我们只需要根据时间
??????????????????//来选择我们所需要的数据就可以了,比如下面这段
???????????????? $sql = "SELECT * FROM chats WHERE dateAdd >" . (time()-(60*5));
??????????????????//意思就是我们只读取我们前5分钟的留言
??????????????
???????????????? $result = mysql_query($sql);

???????????????? $xmlData = "<datas>n";
???????????????? while($row = mysql_fetch_array($result)){
????????????????????????$xmlData .=??"??<data id='" . $row['id'] . "'>n";
????????????????????????$xmlData .= "<name>" . $row['username'] . "</name>n";
????????????????????????$xmlData .= "<message>" . $row['message'] . "</message>n";
????????????????????????$xmlData .=??"??</data>n";
??????????????????}
???????????????? $xmlData .= "</datas>";
???????????????? print $xmlData;
?>

??????
?????? 这样就完成了第一板斧设置。PHP端的代码基本算是完成了。那么下面第二、三板斧,那就简单了, FLASH是啥? FLASH就是客户端表现程序,明白?这个放到明天再写。?
第二板斧:发送
???????? 不过在正式编写程序之前,我们需要在 FLASH舞台上放好三个组件。框架可以随你摆放,为了统一的格式,就按照我的DEMO摆放就可以了,等你以后熟悉了,就可以自己随便玩。Demo在哪里?点图片啊。
????????? 我们需要摆放的是:一个TextArea(命名:messagesTxt);两个TextInput,消息板块一个,用户板块一个,分别命名为:newMsgTxt,usernameTxt;还有一个Button,就是点击发送功能,命名为:sendBtn

??????????好了,开始代码编写,新建一层,按“F9”,跳出代码窗口,往里面输入代码:


//设置PHP文件放置地址
var phpPath:String = "http://localhost/flashChatroom/";
var phpSendMessage:String= phpPath + "message.php";
var phpLoadMessages:String= phpPath + "getMessages.php";

function sendMessage(e:MouseEvent):void {
//如果用户名为空就返回
??if (usernameTxt.text == "") {
????return;
??}

//只有信息的字符大于1时,才发送数据
??if (newMsgTxt.text.length >= 1) {
????var variables:URLVariables = new URLVariables();
????variables.user = usernameTxt.text;
????variables.msg = newMsgTxt.text;


????var urlRequest:URLRequest = new URLRequest(phpSendMessage );
????urlRequest.method = URLRequestMethod.POST;
????urlRequest.data = variables;

????var urlLoader:URLLoader = new URLLoader();
????urlLoader.addEventListener(Event.COMPLETE,sendMessageHandler);
????urlLoader.load(urlRequest);
???
?? //让新发的信息兵分两路,一部分发到PHP,添加到MYSQL数据库里,一部分就是添加到TextArea组件里
?? //你可以好好想想为啥要这么做呢?
????addMessage(usernameTxt.text,newMsgTxt.text);
??}
}
function addMessage(user:String,msg:String):void {
??messagesTxt.htmlText += user + ": " + msg + "n";
}

//其实这个构造函数在这里没多大用,因为我们有另外的读取函数
//这里只需要清空信息空格里的信息就可
function sendMessageHandler(e:Event):void {
????????newMsgTxt.text = "";
}

//最后别忘了,点了按钮才能发送数据?
sendBtn.addEventListener(MouseEvent.CLICK,sendMessage);


?? 第三板斧:接收
??????发是发完了,我们该怎么接收呢?前面说过,我们读的数据是PHP导出的XML文件 ,而且是需要每5秒去读取一次,保持数据的更新,那么我们先制作接收的构造函数,然后再制作时间计数器。
????

function loadMessages():void {
?????? //你说多个randomTxt是干嘛呢?就是为了能够不断的刷新缓存用的。
????????var randomTxt:String= "?rand="+Math.random();
??var urlRequest:URLRequest = new URLRequest(phpLoadMessages +??randomTxt);
??
????????var urlLoader:URLLoader = new URLLoader();
??urlLoader.addEventListener(Event.COMPLETE,loadMessagesHandler);
??urlLoader.load(urlRequest);
}
//下面的构造函数就是读取XML,然后分析XML,再把数据放到TextArea里
function loadMessagesHandler(e:Event):void {
??var loader:URLLoader = URLLoader(e.target);
??var xml:XML = new XML(loader.data);
?????? //清空数据
??messagesTxt.htmlText = "";

??for each (var item in xml..data) {
????addMessage(item.name,item.msg);
??}
}

//时间 计数器
var timer:Timer;
function init():void {
??timer = new Timer(5000,0);
??timer.addEventListener(TimerEvent.TIMER,timerHandler);
??timer.start();
??loadMessages();
}
function timerHandler(e:TimerEvent):void {
??loadMessages();
}
//因为我需要一开始就让时间计数器就运行,所以程序初始就把计数器运行。
init();


???? 完成了,你只要把这两部分的代码放到一起,自己再整理下,应该能明白了。当然里面还有点这样那样的小问题,后面我会找两个比较重要的问题再写两篇文章。毕竟是简易聊天室嘛。
大概程序,我们已经完成了,那么里面肯定有无数这样那样的问题,我们就挑比较重要的几个来说一下。
????????? 当我们输入信息的时候,我们是否可以之间按回车就发送信息呢?
??????????当然可以, FLASH的TextInput组件就有这个enter事件。只要在之前的代码里继续加上:
import fl.events.ComponentEvent;
newMsgTxt.addEventListener(ComponentEvent.ENTER,sendMessageEnter);
function sendMessageEnter(e:ComponentEvent){
??????????sendMessage();
}

??????????? 其实这段代码是有个陷阱的,如果 你不注意,是肯定会出错的。为什么呢?
?????????? 因为,我们以前写的发送构造函数是点击Button后发生的,那么里面的Event就是MouseEvent,可是,我们现在又多加了个Enter事件,那么发送构造函数肯定要重新写。取个巧,把以前的 sendMessage(e:MouseEvent) 改成:sendMessage() ;然后把监听BUTTON CLICK事件和TEXTINPUT ENTER事件分开写成:
????????

????????sendBtn.addEventListener(MouseEvent.CLICK,sendMessageClick);
????????newMsgTxt.addEventListener(ComponentEvent.ENTER,sendMessageEnter);
????????function sendMessageClick(e:MouseEvent):void{
?????????????????? sendMessage();
????????}
????????function sendMessageEnter(e:ComponentEvent):void{
?????????????????? sendMessage();
????????}

???????? 这样就解决了事件不同的问题,现在输入信息,直接按回车就可以发送数据了。
一个新的问题是:如果聊天的内容太多了,TextArea出现了滑动杆,但是如果不特意制作一下的话,里面的信息一直都不是最下面的。
?????????? 如何让TextArea里的文本保持在最下面呢?
??????????在TextArea里有个 verticalScrollPositionmaxVerticalScrollPosition这两属性,只要让verticalScrollPosition? 等于maxVerticalScrollPosition 这个数值,并且保持不断更新,那么就可以解决这个问题。所以新的代码为
??????
addEventListener(Event.ENTER_FRAME,go); function go(e:Event):void{ ??messagesTxt.verticalScrollPosition = messagesTxt.maxVerticalScrollPosition; }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读