即时通信(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>
时间: 2024-08-04 12:05:35

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

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

http://flexman.blog.sohu.com/129838570.html http://flexman.blog.sohu.com/130007574.html step 1: 首先要确定RTMP的端口,可以利用netstat -an来查看 step 2: 修改services-config.xml,确保有rtmp的相关节点: <channel-definition id="my-rtmp" class="mx.messaging.channels.RTM

百度云消息推送机制在即时通信聊天界面的信息处理,技巧篇。

转载请注明出处:http://blog.csdn.net/yianemail/article/details/47044019 百度云消息推送,消息在客户端的处理以及消息显示方式是基于通知栏消息提示. 但是这明显不是我们想要的效果,我们想要的是利用它实现聊天,即:在通信聊天界面如何实时更新推送的消息,以不断接受的消息实现聊天. 一:我们知道利用百度消息推送,要实现自己的PushMessageReceiver. 里边重要的是有三个方法,即: public class BaiduPushReceiv

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

项目背景:小程序中实现实时聊天功能 一.服务器域名配置 配置流程 配置参考URL:https://developers.weixin.qq.com/miniprogram/dev/api/api-network.html 二.nginx中配置反向代理加密websocket(wss) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 3

iOS开发之使用XMPPFramework实现即时通信

iOS开发之使用XMPPFramework实现即时通信 关于XMPP的理论介绍在本篇博客中就不做赘述了,如何在我们之前的微信中加入XMPP协议来实现通信呢?下面将会介绍一下XMPP的基本的知识,让我们的微信可以实现互联通信.要做的准备工作是要有服务器支持XMPP协议,然后通过spark注册个测试账号,最后就可以通过XMPP用我们已有的账号和密码进行通信啦.至于如何使服务器支持XMPP协议,如何通过Spark注册账号,不是本篇博客的论述主题,本篇博客中主要是如何在我们的App中使用XMPP协议.

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

转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html   By Kevince 最近在看linux网络编程相关,现学现卖,就写了一个简易的C/S即时通信程序,代码如下: head.h 1 /*头文件,client和server编译时都需要使用*/ 2 #include <unistd.h> 3 #include <stdio.h> 4 #include <sys/types.h> 5 #include <sys

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

转自:http://www.cnblogs.com/zhili/archive/2012/09/23/2666987.html 引言: 前面专题中介绍了UDP.TCP和P2P编程,并且通过一些小的示例来让大家更好的理解它们的工作原理以及怎样.Net类库去实现它们的.为了让大家更好的理解我们平常中常见的软件QQ的工作原理,所以在本专题中将利用前面专题介绍的知识来实现一个类似QQ的聊天程序. 一.即时通信系统 在我们的生活中经常使用即时通信的软件,我们经常接触到的有:QQ.阿里旺旺.MSN等等.这些

Android IM即时通信开发总结

IM即时通信的最大成功实例应该就是微信了吧,,,这次的IM即时通信是建立在Bmob上的,借用了人家的服务端和IM.Android SDK 传送: Andorid快速入门 详细开发文档 IM快速入门 它的文档组织不是很好,我觉得基本上就是这三个链接比较好,所有的链接都来自这个页面 http://docs.bmob.cn/android/developdoc/index.html?menukey=develop_doc&key=develop_android 然后就是要自己看类库文档,不得不说,写得

iOS学习43即时通信之XMPP(2)

本篇是 即时通信之XMPP(2) 接上次 即时通信之XMPP(1) 1. 好友列表 1> 初始化好友花名册 // 获取管理好友的单例对象 XMPPRosterCoreDataStorage *rosterStorage = [XMPPRosterCoreDataStorage sharedInstance]; // 给roster属性进行初始化 self.xmppRoster = [[XMPPRoster alloc] initWithRosterStorage:rosterStorage di

基于mina的的android即时通信app

前段时间研究mina框架,发现很适合做即时通信后台,经过几个月的研发本人开发了一套基于mina框架的android即时通信app,暂命名为E聊.鉴于本人能力有限还存在不少bug,希望大家原谅并指出,bug和部分功能还在不断完善中,过段时间部分代码会进行开源,敬请关注. 主要功能包括: 1.私聊,群聊 2.支持文字.语音.图片.文件.小视频等 3.位置共享(开发中) 4.朋友圈(图文发布.评论等,小视频功能正在开发中) 5.上线通知,断线重连 6.接收离线消息 7.更多功能正在筹划中... 演示图