即时通信(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条消息)要么则限制用户数. 但稳 ...
随机推荐
- 【leetcode】155 - Min Stack
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...
- PHP 代码质量检测工具的安装与使用
代码统计工具 PHPLOC安装:wget https://phar.phpunit.de/phploc.phar chmod +x phploc.phar sudo mv phploc.phar /u ...
- bzoj 3289 Mato的文件管理(莫队算法+BIT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3289 [题意] 回答若干个询问:[l,r]区间内的逆序对个数. [思路] 莫队算法,B ...
- ASP.NET下跨应用共享Session和使用Redis进行Session托管简介
在之前的博客中,我说到了Session的共享问题,其中说到了Web Farm和Web Garden两种情况下Session的处理.在ASP.NET提供的Session处理方法中,有以下四种模式: 1. ...
- 第一个Java Rest服务
package com.example; import javax.ws.rs.GET; import javax.ws.rs.PUT; import javax.ws.rs.Path; import ...
- Java NIO 操作总结
问题: 1.Java NIO 出现大量CLOSE_WAIT或TIME_WAIT的端口无法释放 CLOSE_WAIT: 参考:http://my.oschina.net/geecoodeer/blog/ ...
- bzoj3714: [PA2014]Kuglarz
[PA2014]KuglarzTime Limit: 20 Sec Memory Limit: 128 MBSubmit: 553 Solved: 317[Submit][Status][Discus ...
- Codeforces Educational Codeforces Round 15 E - Analysis of Pathes in Functional Graph
E. Analysis of Pathes in Functional Graph time limit per test 2 seconds memory limit per test 512 me ...
- 关闭HTML5只能提示(form上新增novalidate)
<form novalidate> <input type="text" required /> <input type="su ...
- [cocos2d-js]chipmunk例子(二)
; ; ; ; <<; var NOT_GRABABLE_MASK = ~GRABABLE_MASK_BIT; var MainLayer = cc.Layer.extend({ _bal ...