实现的一般步骤是:

step 1: 定义NetConnection对象连接rtmp,并监听NetStatusEvent.NET_STATUS事件

step 2: 在NetStatusEvent.NET_STATUS事件里判断event.info.code=="NetConnection.Connect.Success",通过SharedObject.getRomote()得到SharedObject对象

step 3: 监听SharedObject对象的SyncEvent.SYNC事件,并sharedObj.connect(netConnection)

step 4: 这个时候可以利用sharedObj.send()向服务器发送消息,然后服务器再把登录消息广播给当前连接的所有客户端

step 5: 在SyncEvent.SYNC事件里可以取到sharedObj.data里的数据了

step 6: 定义一个供服务器调用后得到返回值的函数,需要声明为public

PS:

服务器端和客户端,都是在操作SharedObject对象,客户端是读取,服务器端是写入(只有服务器执行写入才能保证数据无误)

服务器端发送消息给每个客户端,分为客户端请求和服务器端请求实现

* 客户端请求一般是调用sharedObj.send("getServerData","message")来实现

* 服务器端是调用netConnection.call("后台方法",null,"message"),然后后台方法定义通过soUser.SendMessage("getServerData", new object[]{"message"})来发送消息

服务器端代码(.net):

using System;
using System.Collections.Generic;
using System.Text;
using FluorineFx.Messaging.Adapter;
using FluorineFx.Messaging.Api;
using FluorineFx.Messaging.Api.SO; namespace ServiceLibrary5
{
public class MyChatApp : ApplicationAdapter
{
public override bool AppConnect(IConnection connection, object[] parameters)
{
string name = parameters[0].ToString();
ISharedObject soUser = this.GetSharedObject(connection.Scope, "onlineUserList");
if (soUser == null)
{
this.CreateSharedObject(connection.Scope, "onlineUserList", false);
soUser = this.GetSharedObject(connection.Scope, "onlineUserList");
} soUser.SetAttribute(name, name); //这里是为了提供给没有parameters参数,而又需要访问连接时传过来的参数
connection.Client.SetAttribute("currentName", name);
return true;
} public override void AppDisconnect(IConnection connection)
{
string name = connection.Client.GetAttribute("currentName").ToString();
ISharedObject soUser = this.GetSharedObject(connection.Scope, "onlineUserList");
if (soUser != null)
{
soUser.RemoveAttribute(name);
} soUser.SendMessage("getServerData", new object[] { name + "已经断开" }); base.AppDisconnect(connection);
} //利用服务器端发送消息的通用方法,客户端需通过netConnection.call()来调用该方法
public void sendMessage(IConnection connection, string msg)
{
string userName = connection.Client.GetAttribute("currentName") as string; ISharedObject soUser = GetSharedObject(connection.Scope, "onlineUserList"); soUser.SendMessage("getServerData", new object[] { msg });
}
}
}

客户端代码(flex):

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" backgroundColor="0xffffff">
<mx:List x="404" y="122" backgroundColor="#3A6EA5" width="115" height="289" id="dlOnlineUsers"></mx:List>
<mx:Label x="420" y="92" text="当前在线用户" fontSize="13"/>
<mx:Label x="67" y="122" text="你的昵称:" fontSize="13"/>
<mx:TextInput id="txtName" x="134" y="123"/>
<mx:Button x="302" y="121" label="登录" click="onLogin()" fontSize="12"/>
<mx:Label x="67" y="225" text="系统信息" fontSize="13"/>
<mx:TextArea id="txtMessage" x="67" y="279" width="287" backgroundColor="#3A6EA5" color="0xffffff" />
<mx:Button x="270" y="420" label="注销" fontSize="12" click="onDisconnect()" />
<mx:Script>
<![CDATA[
private var nc:NetConnection;
private var soUser:SharedObject; private function onLogin():void
{
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatus);
nc.connect("rtmp://localhost:8323/MyChatRoom",this.txtName.text);
nc.client = this;
} private function onNetStatus(event:NetStatusEvent):void
{
if(event.info.code == "NetConnection.Connect.Success")
{
soUser = SharedObject.getRemote("onlineUserList",nc.uri,false);
if(soUser != null)
{
soUser.addEventListener(SyncEvent.SYNC,onSYNC);
soUser.connect(nc);
soUser.client = this;
}
soUser.send("getServerData","用户【" + this.txtName.text + "】已连接");
}
} private function onDisconnect():void
{
nc.close();
} private function onSYNC(event:SyncEvent):void
{
var arrUser:Array = new Array();
for(var str:String in soUser.data)
{
arrUser.push(soUser.data[str]);
}
this.dlOnlineUsers.dataProvider = arrUser;
} public function getServerData(message:Object):void
{
this.txtMessage.text += message.toString()+"\n";
}
]]>
</mx:Script> </mx:Application>

即时通信(RPC)的Rtmp实现--代码实现篇的更多相关文章

  1. 即时通信(RPC)的Rtmp实现--配置篇

    http://flexman.blog.sohu.com/129838570.html http://flexman.blog.sohu.com/130007574.html step 1: 首先要确 ...

  2. 微信小程序实现即时通信聊天功能的实例代码

    项目背景:小程序中实现实时聊天功能 一.服务器域名配置 配置流程 配置参考URL:https://developers.weixin.qq.com/miniprogram/dev/api/api-ne ...

  3. iOS开发之使用XMPPFramework实现即时通信(三)

    你看今天是(三)对吧,前面肯定有(一)和(二),在发表完iOS开发之使用XMPPFramework实现即时通信(一)和iOS开发之使用XMPPFramework实现即时通信(二)后有好多的小伙伴加我Q ...

  4. iOS开发之使用XMPPFramework实现即时通信(二)

    上篇的博客iOS开发之使用XMPPFramework实现即时通信(一)只是本篇的引子,本篇博客就给之前的微信加上即时通讯的功能,主要是对XMPPFramework的使用.本篇博客中用到了Spark做测 ...

  5. 【原】iOS学习43即时通信之XMPP(2)

    本篇是 即时通信之XMPP(2) 接上次 即时通信之XMPP(1) 1. 好友列表 1> 初始化好友花名册 // 获取管理好友的单例对象 XMPPRosterCoreDataStorage *r ...

  6. 【原】iOS学习42即时通信之XMPP(1)

    1. 即时通信 1> 概述 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,服务提供商也提供了越来越丰富的通讯服务功能 ...

  7. [C# 网络编程系列]专题九:实现类似QQ的即时通信程序

    转自:http://www.cnblogs.com/zhili/archive/2012/09/23/2666987.html 引言: 前面专题中介绍了UDP.TCP和P2P编程,并且通过一些小的示例 ...

  8. C语言 linux环境基于socket的简易即时通信程序

    转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html      ——By Kevince 最近在看linux网络编程相关,现学现卖,就写了一个简易 ...

  9. .NET 即时通信,WebSocket服务端实例

    即时通信常用手段 1.第三方平台 谷歌.腾讯 环信等多如牛毛,其中谷歌即时通信是免费的,但免费就是免费的并不好用.其他的一些第三方一般收费的,使用要则限流(1s/限制x条消息)要么则限制用户数. 但稳 ...

随机推荐

  1. 黑马程序员——有关protocol的小结

    在OC程序中经常会有这样的问题就是一个类想让其他类帮自己实现某些方法,然后再将结果返回给这个类:如何让一个类要找的代理去实现自己想要的方法呢? 这样就需要有一个协议,让能遵守协议的其他类都能实现协议中 ...

  2. SVN的搭建和使用总结

    Subversion是优秀的版本控制工具,其具体的的优点和详细介绍就不多做介绍,主要说一下SVN的服务端搭建.客户端安装.使用及出现的问题的解决办法. 首先来下载和搭建SVN服务器. 现在Subver ...

  3. Linux-head,tail用法

    linux ---tail命令 linux中tail命令---用于查看文件内容 最基本的是cat.more和less. 1. 如果你只想看文件的前5行,可以使用head命令,如: head -5 /e ...

  4. filter在CSS中的效果

    滤镜说明: Alpha:设置透明层次 blur:创建高速度移动效果,即模糊效果 Chroma:制作专用颜色透明 DropShadow:创建对象的固定影子 FlipH:创建水平镜像图片 FlipV:创建 ...

  5. 在CENTOS下安装ORACLE 11g(LT项目开发参考)

    前段时间为K3CLOUD项目安装ORACLE服务器,因有同事对LINUX和ORACLE不熟,现整理文档,方便后面维护人员参考 ORACLE的安装 1.首先安装依赖包(新安装的centos需要,现服务器 ...

  6. 深刻理解Python中的元类metaclass(转)

    本文由 伯乐在线 - bigship 翻译 英文出处:stackoverflow 译文:http://blog.jobbole.com/21351/ 译注:这是一篇在Stack overflow上很热 ...

  7. windows平台下安装python的setuptools工具

    到下面的网址下载setuptools-0.6c11.win32-py2.7.exe http://pypi.python.org/pypi/setuptools#files 然后安装setuptool ...

  8. 【Visual Studio2010】创建XAML分析插件

    最近项目[Silverlight]中的需要实现国际化,需要对所有控件进行一个处理.由于使用了Telerik的控件,只需要去掉原有的Label或者Header属性,然后添加一个资源Key即可.但是在项目 ...

  9. DaoFactory.java

    package com; import com.isoftstone.fwk.dao.ActionDao; import com.isoftstone.fwk.dao.Dao; import com. ...

  10. java getEnv不区分大小写 getProperty区分大小写

    System.out.println(System.getenv("JAVA_HOME")); System.out.println(System.getenv("Pat ...