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


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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值