本文要介绍的内容主要有利用SharedObject来实现聊天文字聊天和在线用户的列表,以及实现语音视频聊天等。

前一篇文章介绍了实现用户注册和登录的功能,本文接着介绍用户注册并成功登录后的相关功能开发。首先分析下功能,用户登录成功要做四件事:

1、显示自己的视频到聊天界面(作用不大,自己看而已)

2、发布自己的视频和语音数据到FMS服务器(这个作用很大,别人则根据你发布的数据查看你的视频等)

3、将自己的基本信息写如共享对象,实现在线用户列表。

4、通过共享对象来实现文字聊天(本文只是为了演示方便,实际开发中应尽量使用Client-Server之间的方法调用实现)

OK,有了上面的分析,接下来一步一步的实现这些功能。显示自己的视频到界面很简单,在以前的相关文章里都有使用到。

private function displayCameraSelf():void
{
    //显示自己的视频
    myCamera = Camera.getCamera();
    if(myCamera != null)
    {
        this.twoVideo.attachCamera(myCamera);
    }
    else
    {
        Alert.okLabel="确 定";
        Alert.show("没检测到视频摄像头!","系统提示");
    }
}

发布视频数据到FMS很简单,既通过NetConnection和NetStream就可以完成,需要注意的是,在发布视频流的时候视频流的命名规则采用的用户名,也就是用户名是什么,他发布的视频流就叫什么名字,其他用户要查看他的视频就是通过他的用户名命名的流名来查看。

private function onLoginRusult(evt:ResultEvent):void
{
    if(evt.result != null)
    {
        //显示自己的视频
        displayCameraSelf();
        
        //连接FMS服务器发布自己的视频流
        publishNc = new NetConnection();
        publishNc.connect("rtmp://localhost/ChatRoom");
        publishNc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler);
        publishNc.client = this;
        
        playNc = new NetConnection();
        playNc.connect("rtmp://localhost/ChatRoom");
        playNc.addEventListener(NetStatusEvent.NET_STATUS,onPlayStatusHandler);
        playNc.client = this;
        
        so = SharedObject.getRemote("ChatSO",publishNc.uri,false);
        so.addEventListener(SyncEvent.SYNC,onSyncHandler);    
        so.connect(publishNc);        
        so.client = this;                
        
        userSO = SharedObject.getRemote("UserSO",publishNc.uri,false);
        userSO.connect(publishNc);
        userSO.client = this;
        
        
        UserName = myUserName = evt.result.UserName;
        NickName = myNickName = evt.result.NickName;
        
        //将当前用户添加到共享对象
        var uarray:ArrayCollection;
        var o:Object = new Object();
        o.UserName=myUserName;
        o.NickName=myNickName;
        
        if(userSO.data.UserList == null)
        {
            uarray = new ArrayCollection();
        }
        else
        {
            uarray = userSO.data.UserList as ArrayCollection;
    
        }
        var temp:ArrayCollection = new ArrayCollection();
        convertArrayCollection(temp,uarray);
        temp.addItem(o);
        userSO.setProperty("UserList",temp);
    
        this.loginPanel.visible = false;
        this.chatRoomPanel.visible=true;
        ChatRoomViewStack.selectedChild = chatRoomPanel;
    }
    else
    {
        Alert.okLabel="确 定";
        Alert.show("登录失败!","系统提示");
    }
}

private function onNetStatusHandler(evt:NetStatusEvent):void
{
    if(evt.info.code == "NetConnection.Connect.Success")
    {
        //连接成功则发布自己的流到FMS
        publishNs = new NetStream(publishNc);
        publishNs.attachAudio(myMic);
        publishNs.attachCamera(myCamera);
        publishNs.client=this;
        //以用户名作为视频流名,直接通过用户名连接对方的流
        publishNs.publish(myUserName,"live");    
    }
}

默认自己和自己对聊,只有从在线用户列表里选择了用户才和对应的人进行视频聊天,也就是说初始化为自己连接到自己的视频流。实现代码如下所示:

private function onPlayStatusHandler(evt:NetStatusEvent):void
{
    if(evt.info.code == "NetConnection.Connect.Success")
    {
        playNs = new NetStream(playNc);
        var v:Video = new Video();
        v.width = 320;
        v.height= 240;
        v.attachNetStream(playNs);
        playNs.play(UserName,"live");
        this.oneVideo.addChild(v);
    }
}

连接到自己发布的视频流,将视频流显示到界面上。

文字聊天使用的共享对象做的大厅聊天,实现很简单,关于共享对象实现文字聊天详细可以查看《使用远程共享对象(SharedObject)实现多人时时在线聊天(Flex | Flash) 》。

/**
 * 发送聊天消息
 * */
private function sendMessage(evt:MouseEvent):void
{
    var tempCollection:ArrayCollection = new ArrayCollection();
    if(so.data.msgCollection != null)
    {
        convertArrayCollection(tempCollection,so.data.msgCollection as ArrayCollection);
    }
    var msg:Message = new Message();
    msg.NickName = myNickName;
    msg.Context = this.txtMessage.text;
    tempCollection.addItem(msg);
    
    //更新远程共享对象中的属性值
    so.setProperty("msgCollection",tempCollection);
    
    this.txtMessage.text="";
}

private function onSyncHandler(evt:SyncEvent):void
{
    if(so.data.msgCollection != null)
    {
        //首次登录进来异步获取消息的时候不显示登录之前的消息
        if(isFirstLogin)
        {
            so.setProperty("msgCollection",null);
            isFirstLogin = false;
        }
        else
        {
            var tempCollection:ArrayCollection = new ArrayCollection();
            convertArrayCollection(tempCollection,so.data.msgCollection as ArrayCollection);
            
            this.displayMessage.text="";
            for(var index:int=0;index<tempCollection.length;index++)
            {
                var message:Object = tempCollection.getItemAt(index);
                var displayMessage:String = message.NickName+"说:"+message.Context;
                this.displayMessage.text += displayMessage + "\n";
            }
        }
    }
    this.displayMessage.verticalScrollPosition=this.displayMessage.maxVerticalScrollPosition;
}

前面用户登录的时候已经将用户信息写入了共享对象,用户在线列表只需要将共享对象的数据读出来,显示在界面上就OK,这里使用tree控件来呈现数据。

private function init():void
{
    nc = new NetConnection();
    nc.connect("rtmp://localhost/ChatRoom");
    nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler);
    nc.client = this;
    
    so = SharedObject.getRemote("UserSO");
    so.addEventListener(SyncEvent.SYNC,onSyncHandler);
    so.connect(nc);
    so.client = this;
}

private function onNetStatusHandler(event:NetStatusEvent):void
{
    if(event.info.code=="NetConnection.Connect.Success")
    {
        if(so.data.UserList!=null)
        {
            var uarray:Array = so.data.UserList as Array;
            this.userTree.dataProvider = uarray;
        }
    }
}

private function onSyncHandler(event:SyncEvent):void
{
    if(so.data.UserList!=null)
    {
        var uarray:Array = so.data.UserList as Array;
        this.userTree.dataProvider = uarray;
    }
}

相关文章连接:

FMS案例开发--视频聊天室(一)

FMS案例开发--视频聊天室(二)

FMS案例开发--视频聊天室(三)

版权说明

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

作      者:Beniao

文章出处:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

转载于:https://www.cnblogs.com/beniao/archive/2009/05/30/1491879.html

FMS案例开发--视频聊天室(三)相关推荐

  1. 网络视频聊天室的开发指南

    目前网上视频聊天室.视频会议软件.可视IP电话软件随处可见,你是否想自己做一个玩玩?其实这类软件无非是视频加上网络而建成的.如果熟悉视频捕 捉和网络传输技术,根本就难不倒你.本文详细介绍了如何利用别人 ...

  2. 即时通讯 音视频聊天室开发建议

    目前网上视频聊天室.视频会议软件.可视IP电话软件随处可见,你是否想自己做一个玩玩?其实这类软件无非是视频加上网络而建成的.如果熟悉视频捕 捉和网络传输技术,根本就难不倒你.本文详细介绍了如何利用别人 ...

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

    上一篇<FluorineFx + Flex视频聊天室案例开发----服务器端>详细的介绍了如何利用FluorineFx开发一个及时通信的视频聊天室服务器处理程序,并通过Web网站来宿主这个 ...

  4. FMS视频聊天室的开发

    FMS视频聊天室的开发 2009年06月07日 由于FLASH技术的发展, FLASH对本地P2P的支持,越来越进这就出现了FMS FLASH视频聊天室的开发. flash聊天室,fms聊天室源码 一 ...

  5. Flex与.NET互操作(十六):FluorineFx + Flex视频聊天室案例开发

    本文将使用FluorineFx和Flex结合介绍一个简单的视频聊天室案例开发,希望通过此篇和大家交流FluorineFx和Flex的相关技术,同时也希望本篇可以帮助到需要使用FluorineFx做及时 ...

  6. 独家揭秘语音视频聊天室开发顶尖制作教程

    互联网的不断发展,各种新技术的兴起,原本做管理软件 的我也逐渐转向从事着互联网相关的运营产品的开发.尤其是目前抄得最火热的音视频互动平台技术,今天我先列出最基本开发流程,适用于开发视频会议系统.语音视 ...

  7. 网页的视频聊天室开发

    现在网上很多朋友在弄网页的视频聊天室 通过学习,我自己也做了个简单的小例子,几十行JavaScript脚本就能轻松实现视频通话:也不用去下载指定的什么浏览器,因为IE.firefox.chrome等w ...

  8. android 使用WebRTC搭建视频聊天室

    使用WebRTC搭建前端视频聊天室--入门篇 https://www.jianshu.com/p/b54b27970534 android webrtc 两个手机 P2P 视频聊天 https://w ...

  9. java_OA管理系统(一):Servlet总结案例仿网络聊天室

    因为我们学校的软件联盟要为我们校区开发一个OA系统,为此我将其所需要的一些技术进行汇总,以便web组组员开发所用. 第一篇是关于Servlet的一个汇总案例,算是开个简单的小头. 一.总述 代码来源于 ...

最新文章

  1. java urlstreamhandler_获取对Java的默认http(s)URLStreamHandler的引用
  2. 我的学习之路_第二十三章_HTML
  3. 设计模式学习笔记二:简单工厂模式
  4. php中怎么定义page,css @page的使用与定义详解
  5. Python中小括号( )、中括号[ ]和大括号{}分别代表什么?
  6. 并发查询parallel_惯用并发:flatMap()与parallel()– RxJava常见问题解答
  7. ThinkPHP中where()方法的使用
  8. [NOIP2018]铺设道路
  9. 深入研究 Iptables 和 Netfilter 架构
  10. JAVA 自定义注解在自动化测试中的使用
  11. Apache 模块 mod_cache应用
  12. 学计算机的感想300字,大学生计算机实训心得体会3篇
  13. Qt使用paintevent事件绘制图像(可进行缩放且能够局部放大)
  14. 跨浏览器共享数据_不懂浏览器安全,被老板邀请爬山?
  15. 成就系统工程师的职业生涯
  16. 关晓彤亮相都市丽人2019秋冬新品推介会
  17. C++小游戏《末日之战1:新生》1.12.31823.132
  18. 基于 Bitwarden 搭建密码管理器(群晖 Docker)
  19. 推荐给比较好用FF插件
  20. 基于Keras实现鸢尾花分类

热门文章

  1. 吴恩达深度学习 —— 2.5 导数
  2. 【渗透测试】cookie注入笔记
  3. TensorFlow第三步 :单层网络-Mnist手写数字识别
  4. 如何制作一个塔防游戏 Cocos2d x 2 0 4
  5. 基于深度学习的文本分类3
  6. 主成分分析(PCA)方法
  7. CSU 1111 三家人
  8. 【版本控制管理】 深入 001 A successful Git branching model GIT 项目分支策略和释放管理
  9. C++学习心得总结【20181128】
  10. sqlite 复合唯一索引_sqlite 批量插入, 重复插入(更新)