即时通信(RPC)的Rtmp实现--代码实现篇
实现的一般步骤是:
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实现--代码实现篇的更多相关文章
- 即时通信(RPC)的Rtmp实现--配置篇
http://flexman.blog.sohu.com/129838570.html http://flexman.blog.sohu.com/130007574.html step 1: 首先要确 ...
- 微信小程序实现即时通信聊天功能的实例代码
项目背景:小程序中实现实时聊天功能 一.服务器域名配置 配置流程 配置参考URL:https://developers.weixin.qq.com/miniprogram/dev/api/api-ne ...
- iOS开发之使用XMPPFramework实现即时通信(三)
你看今天是(三)对吧,前面肯定有(一)和(二),在发表完iOS开发之使用XMPPFramework实现即时通信(一)和iOS开发之使用XMPPFramework实现即时通信(二)后有好多的小伙伴加我Q ...
- iOS开发之使用XMPPFramework实现即时通信(二)
上篇的博客iOS开发之使用XMPPFramework实现即时通信(一)只是本篇的引子,本篇博客就给之前的微信加上即时通讯的功能,主要是对XMPPFramework的使用.本篇博客中用到了Spark做测 ...
- 【原】iOS学习43即时通信之XMPP(2)
本篇是 即时通信之XMPP(2) 接上次 即时通信之XMPP(1) 1. 好友列表 1> 初始化好友花名册 // 获取管理好友的单例对象 XMPPRosterCoreDataStorage *r ...
- 【原】iOS学习42即时通信之XMPP(1)
1. 即时通信 1> 概述 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,服务提供商也提供了越来越丰富的通讯服务功能 ...
- [C# 网络编程系列]专题九:实现类似QQ的即时通信程序
转自:http://www.cnblogs.com/zhili/archive/2012/09/23/2666987.html 引言: 前面专题中介绍了UDP.TCP和P2P编程,并且通过一些小的示例 ...
- C语言 linux环境基于socket的简易即时通信程序
转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html ——By Kevince 最近在看linux网络编程相关,现学现卖,就写了一个简易 ...
- .NET 即时通信,WebSocket服务端实例
即时通信常用手段 1.第三方平台 谷歌.腾讯 环信等多如牛毛,其中谷歌即时通信是免费的,但免费就是免费的并不好用.其他的一些第三方一般收费的,使用要则限流(1s/限制x条消息)要么则限制用户数. 但稳 ...
随机推荐
- R 安装与环境配置
R语言是一种很方便的应用于科学计算的语言,推荐给大家学习. 由于R的版本对程序包的兼容有些问题,推荐使用2.15.3. 下面给出下载链接,安装一路默认即可,可以自己更存放目录,其他的都没有影响.下面是 ...
- 【LeetCode】217 & 219 - Contains Duplicate & Contains Duplicate II
217 - Contains Duplicate Given an array of integers, find if the array contains any duplicates. You ...
- leetcode:Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters. For example, ...
- 前端架构:Angular与requirejs集成实践
这几天angular与requirejs.browserify的集成弄的博主头好晕,今天终于成功集成了requirejs,现写些心得体会在这里. 核心思想:angular加载时有一定的顺序,必须依次加 ...
- SpringMVC + Spring + MyBatis 学习笔记:遭遇order by 排序问题
系统:WIN8.1 数据库:Oracle 11GR2 开发工具:MyEclipse 8.6 框架:Spring3.2.9.SpringMVC3.2.9.MyBatis3.2.8 用MyBatis写排序 ...
- 线性时间内确定T[0:n]是否有一个主元素
设T[0:n-1]是n 个元素的数组.对任一元素x,设S(x)={ i | T[i]=x}.当| S(x) |>n/2 时,称x 为T 的主元素.设计一个算法,确定T[0:n-1]是否有一个主元 ...
- spark的环境安装
1.安装sbt 正常安装流程. 在cmd里运行的时候,要提前设置代理(如果上网有代理),set JAVA_OPTS=-Dhttp.proxySet=true -Dhttp.proxyHost=172. ...
- HIve体系结构,hive的安装和mysql的安装,以及hive的一些简单使用
Hive体系结构: 是建立在hadoop之上的数据仓库基础架构. 和数据库相似,只不过数据库侧重于一些事务性的一些操作,比如修改,删除,查询,在数据库这块发生的比较多.数据仓库主要侧重于查询.对于相同 ...
- JNLP + Applet + Bouncy Castle
http://stackoverflow.com/questions/4275005/jnlp-applet-bouncy-castle ——————————————————————————————— ...
- B. Rebranding
http://codeforces.com/problemset/problem/591/B B. Rebranding time limit per test 2 seconds memory ...