微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

FluorineFx + Flex视频聊天室案例开发----客户端

FluorineFx + Flex视频聊天室案例开发----客户端

      上一篇FluorineFx + Flex视频聊天室案例开发----服务器端》详细的介绍了如何利用FluorineFx开发一个及时通信的视频聊天室服务器处理程序,并通过Web网站来宿主这个服务处理程序的运行。本篇将着重介绍视频聊天室的客户端开发,包括连接RTMP服务器、发布视频、接收视频、在线用户列表、发送文本消息以及全服务器小喇叭功能点。

      上述这些功能点在我以前写的文章里已经出现了N多次了,所以这里我不想过多的在次对他们进行解说,详细请查阅《Flex与.NET互操作系列文章 》,这里我将核心的几个方法代码贴出来简单说明。首先就是客户实现用户登录,通过FluorineFx提供的RemotingService的接口方法进行数据验证。

private  function onLogin( event :MouseEvent): void
{
    remoteConn 
=   new  RemotingConnection( " http://localhost:2020/ChatRoom.FluorineFxWeb/Gateway.aspx " ,ObjectEncoding.AMF3);
    myInfo 
 UserInfo();
    myInfo.UserName
this .txtUserName.text;
    myInfo.Password
.txtPassword.text;
    remoteConn.RemotingCall(
ChatRoom.Services.DataService.Login  function onLoginResult(result:UserInfo):
{
    
if (result  != null )
    {
        
.myInfo   result;
        
.viewStack.selectedChild   chatView;
        rtmpnc 
 RtmpConnection( rtmp://localhost:2777/VideoChat else
    {
        
.lbState.text    登陆失败,用户名或密码错误 ;
    }
}

 function onLoginFault( :Object): ;
}

 function onClear( .txtUserName.text = "" ;
    
.txtPassword.text .lbState.text .txtUserName.setFocus();
}

 

      RemotingConnection和RtmpConnection是我自己扩展的NetConnection类,功能和NetConnection一样,不同的是封装后的使用相对来说比较方便点。首先通过RemotingService的接口进行用户名和密码验证,通过了则创建一个到RTMP服务器的连接RtmpConnection(等同于NetConnection)。

 function onNetStatusHandler( :NetStatusEvent):
{
    trace(
.info.code);
    
switch ( .info.code)
    {
        
case NetConnection.Connect.Success :onConnSuccess(); break ;
        
NetConnection.Connect.Failed :onConnError();  function onConnSuccess(): // 将自己的视频数据发布到RTMP服务器,这里使用的是FluorineFx
    var mic:Microphone   Microphone.getMicrophone();
    var publishNs:NetStream 
 NetStream(rtmpnc);
    publishNs.attachCamera(cam);
    publishNs.attachAudio(mic);
    publishNs.client 
;
    publishNs.publish(myInfo.ID.toString()); 
用户ID作为流名进行发布实况流     
    userSO 
 Sharedobject.getRemote( OnLineUsers false );
    userSO.addEventListener(SyncEvent.SYNC,onSyncHandler);
    userSO.client 
;
    userSO.connect(rtmpnc);
    
    timer 
 Timer( 1000 );
    timer.addEventListener(TimerEvent.TIMER,onTimerHandler);
    timer.start();
}

 function onConnError():
{
    trace(
login error );
    writeMessage(
<font color=\ #FF0000\ >系统提示:连接视频服务器失败</font> );
}

 

      创建连接的同时指定了由那一个方法(onNetStatusHandler)来处理连接状态,通过判断连接状态如果连接成功则将自己的视频数据发布到RTMP服务器(特别提醒:在发布流的时候是使用的用户ID作为流名,在建立视频聊天的时候需要根据这个ID才能查看到视频),同时还连接到服务器上的远程共享对象(作用:通过异步事件处理函数实现在线用户列表),最后建立了一个Timer是不断的调用服务器方法获取当前系统时间(注意:实际开发中不建议这样做);如果连接服务器失败则在聊天消息显示区输入一条提示信息。

      在线用户列表使用共享对象来实现,可以及时的处理用户上线下线功能和实现客户端数据同步更新等。下面是共享对象的异步事件处理函数

 function onSyncHandler( :SyncEvent):
{
    var array:Array 
.target.data.UserInfo  as  Array;
    
(array  )
    {
        userArray.removeAll();
        
for (var i:Number 0 ; i < array.length; i ++ )
        {
            var info:UserInfo 
 array[i]   UserInfo;
            userArray.addItem(info);
        }
        trace(
userArray length: +  userArray.length);
    }
}

 

      从异步事件中取出当前最新的数据,然后添加用户界面的显示列表数组(userArray)里,Flex直接使用List组件显示在线用户列表,通过绑定userArray设置数据源,当userArray改变后List组件的显示也会同步更新显示

       那么怎么去建立视频聊天查看到对方的视频呢?其实实现也很简单,这里还是要从用户列表出发,通过点击用户列表上的在线用户,然后建立与该用户的视频连接。同时判断是否选择的是怎么,本案例中我没有将自己从在线列表里屏蔽而是通过判断当前选择的是否为自己,如果是自己则不进行视频连接,也不能发送文本聊天信息。

 function onUserItemHandler( :Event):
{
    info 
 List( .target).selectedItem   UserInfo;  //把当前选择的用户信息通过变量保存下来
    
.lbNickName.text   info.NickName;
    
    
(info.UserName  ==  myInfo.UserName)
    {
        writeMessage(
>系统提示:不能和自己进行视频聊天</font> );
    }
    
建立视频流的连接          .ns)
        {
            
.ns.close();
        }
        
.ns   NetStream( .rtmpnc);
        ns.client 
;
        sound 
.ns.soundTransform;
        var v1:Video 
 Video();
        v1.width 
320 ;
        v1.height 
240 ;
        v1.attachNetStream(ns);
        
.videodisplay.addChild(v1);
        ns.play(info.ID.toString());  //当前选择的用户的ID
    }
}

 

      OK,到这里就成功的完成了用户登录,建立与RTMP服务器的连接,发布视频流,接收指定的视频流等功能,接下来就是实现文字聊天的功能了。实现文字聊天功能是最简单的,我曾经先后在《FMS3系列(六):使用远程共享对象(SharedObject)实现多人时时在线聊天(Flex | Flash) 》和《Flex与.NET互操作(十二):FluorineFx.Net的及时通信应用(Remote Shared Objects)(三) 》这两篇文章中都介绍到了,这里我使用的是第二篇文章里所介绍的方法提示:该方法就是直接使用Sharedobject的send()方法)来实现文字聊天功能

 

 function onSendMessage( (info )
    {
        userSO.send(
chatMessage .txtMessage.text, myInfo, info);
        
.txtMessage.text ;
    }
    

    {
        writeMessage(
系统提示:请选择聊天对象 );
    }
}

public  function chatMessage(message:String, sayUser:UserInfo, recUser:UserInfo): (recUser.UserName .myInfo.UserName)
    {
        message 
 sayUser.NickName  对你说: message;
        writeMessage(message);
    }
    
(sayUser.UserName 我对 recUser.NickName  说: message;
        writeMessage(message);
    }
}

 function writeMessage(message:String): .txtdisMessage.htmlText  +=  message  \n .txtdisMessage.verticalScrollPosition  .txtdisMessage.maxVerticalScrollPosition;
}

 

      OK,大功告成,现在是集视频和文字聊天的多人在线聊天室就实现了,不足的是只能一对一聊天。如果我要对大家说话怎么办呢?于是我在本案例中设计了一个小喇叭功能,通过发送小喇叭实现全服务器喊话。下边是下喇叭组件代码

<? xml version 1.0  encoding utf-8 ?> mx:TitleWindow xmlns:mx http://www.adobe.com/2006/mxml  layout absolute  width 540  height 50  
    headerHeight
8  roundedBottomCorners true  borderColor #000000 >
    
mx:TextInput x 2  y 3 400  id txtMessage /> mx:Button x 466  label 关闭  click onClose(event) 410 发送  
        enabled
{txtMessage.text.length > 0 ? true : false}  
        click
onSend(event)
    
    
mx:Script
        
<! [CDATA[
            import mx.core.Application;
            import mx.events.CloseEvent;
            import mx.managers.PopUpManager;
            
 function init():
            {
                
.txtMessage.setFocus();
            }
            
            
 function onClose(
            {
                onCloseHandler(
);
            }
            
            
 function onCloseHandler( :CloseEvent):
            {
                Application.application.speakFlag 
;
                PopUpManager.removePopUp(
 function onSend(
            {
                Application.application.userSO.send(
speakMessage .txtMessage.text  ;
                onCloseHandler(
);
            }
        ]]
</ mx:TitleWindow >


      同样通过远程共享对象的send()方法实现发送小喇叭功能,在客户端定义一个方法(speakMessage)来接受小喇叭发送的消息内容,然后显示用户聊天界面上。

 var speakFlag:Boolean  ;
 function onSpeaker( ! speakFlag)
    {
        var dis:Speaker 
 Speaker();
        dis.x 
230 ;
        dis.y 
505 ;
        PopUpManager.addPopUp(dis,0)">);
        speakFlag 
true ;
    }
}
 function speakMessage(message:String,info:UserInfo):
{
    message 
【小喇叭】:  info.NickName   message;
    writeMessage(message); 
}

 

      貌似这一整篇都是代码,除了代码我也不知道该怎么去介绍更容易说得清楚了,下面来看看上面的劳动成功,启动服务器后运行多个客户端来聊天测试看看。            

            

            

            

 

      现在还差一个重要的功能没有实现了,前面提到过画中画功能,也就是说在和在线朋友进行视频聊天的同时,需要将自己的视频以小视频窗口的方式显示在聊天窗口,实现所谓的画中画功能显示自己的视频通过初始化方法,程序启动后就直接显示出自己的视频。

将自己的视频显示在画中画中     cam   Camera.getCamera();
    
(cam  .myVD.attachCamera(cam);
    }
    
未能找到视频设备,请检测是否正确安装设备! );
    }
}

 

      本文就介绍到这里,关于聊天表情的实现这里就不作介绍了,由于时间关系本案例里也没有实现这个功能,有兴趣的朋友可以下载源代码自己去扩展实现聊天表情这个功能。这里我将实现的原理简单说一下,通过TileList组件加载表情图片或动画信息显示出来,详细可以参考《使用TileList+TitleWindow组件开发聊天表情功能 》,发送表情则是将图片地址通过Sharedobject的send()方法发送出去,接收消息的方法通过图片地址,组合<img src='图片地址' />然后显示在聊天信息窗口中。

 

版权说明

  本文属原创文章,欢迎转载,其版权归作者和博客园共有。  

  作      者:Beniao

 文章出处:http://beniao.cnblogs.com/  或  http://www.voidcn.com/article/p-ugwheald-bnx.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐