【c#、Red5】关于c#如何使用FluorineFx与Red5通信及相关

5 篇文章 0 订阅

    啊呀,今天登录CSDN的时候,收到几位网友的私信,大体都是询问关于如何使用FluorineFx这个库的,之前我是有计划写教程的,可能由于其他事情耽误,然后忘记了,见谅~

    好了,直接转入正题,首先,这个库是做什么的呢?简单来说,就是c#的一个用于使用Rtmp协议进行通信的库,具体的用法其实不难,如果你要是有flex的经验的话,上手就会很快的。

    我这里使用的是Red5服务器作为Rtmp协议的服务器,简单实现一个调用服务器方法,回调方法,共享对象发送信息等功能仅供大家参考,如果还有不明白的或者想深入研究的话,我们可以深入交流一下哦~~~~(基佬奏凯!!!!!!!!)

    首先,我们需要下载dll,我已经上传到我的资源库里面了,大家可以从这个资源库进行下载:http://download.csdn.net/download/z3237109/9281349

    下载之后,导入c#项目,添加这5个dll的引用。

    然后是使用方式,假设,我们网络上端的服务器(Red5)地址是:10.10.17.105,然后我们在服务器上先架好webapp,用Java添加我们用于测试的让客户端调用的服务器方法:

public void SendMsgToTeacher(Object msg) {

	}
    传入的参数可以是Object,也可以是String,这个需要flex的基本知识,当flex与Red5进行传参的时候,大体上都可以转化为String型的,也就是说,当我们用c#给Red5传参的时候,如果只是传递一个“测试数据”这样的字符,这个函数还可以变成这样:

public void SendMsgToTeacher(String msg) {

	}
    至于服务器反向调用客户端的方法,我们需要下面的代码:

if (TeacherConn != null) {
	if (TeacherConn instanceof IServiceCapableConnection) {//添加的新学生,标示“+”
		((IServiceCapableConnection) TeacherConn).invoke("RefreshUserList", new Object[] { "z", "1", "2"},
						null);
		}
}<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
    TeacherConn是在Red5上用Java声明的IConnection类型的值,当我们写的c#端客户端连接上Red5之后,在Red5的登录函数里面(Application类connect函数,我是用的1.0.7版本的Red5,如果你使用的是1.0.0之前的版本,可能登录的函数是roomJoin),我们能获取到同样是IConnection类型的c#客户端链接,这个时候,我们就需要保存一下这个链接,这里可以赋值给TeacherConn,方便我们后面直接调用(TeacherConn是全局变量哦~)。

    RefreshUserList是我们在c#端声明的一个函数,用于服务器直接调用的函数,null其实是一个回调函数,就是方便我们查看调用客户端函数之后的状态。

    截至现在,Red5服务器端的基本主要代码就完事了,接下来就是重头戏了,c#端的代码编写。

    引用这几个dll之后,我们可以声明NetConnection类型的对象了:

  Red5NetConnectio = new NetConnection();
  Red5NetConnection.Client = this;
  Red5NetConnection.ObjectEncoding = ObjectEncoding.AMF0;
  Red5NetConnection.OnConnect += new ConnectHandler(RedNetConnection_OnConnect);
  Red5NetConnection.NetStatus += new NetStatusHandler(Red5NetConnection_NetStatus);
  Red5NetConnection.OnDisconnect += new DisconnectHandler(RedNetDisConnection_OnConnect);
  Red5NetConnection.Connect("rtmp://10.10.17.105:1935/red5Server/测试", "参数1", "参数2", "参数3", "参数4");
    四不四和flex的用法很像呀?

    第二行,设置Client为this是为了让服务器调用客户端函数的时候能够指向当前类中的函数,编码方式选用AMF0,然后再注册几个关键的网络状态回调函数,就可以调用connent进行连接了(后面的参数只是举个例子,具体大家可以自行设置,不过要与接收的服务器端关于登录参数的数量、类型匹配上哦)。

    接下来链接共享对象(我写在RedNetConnection_OnConnect回调函数中):

  Red5SharedObject = RemoteSharedObject.GetRemote("CeShiSharedObject", Red5NetConnection.Uri.ToString(), false);
  Red5SharedObject.OnConnect += new ConnectHandler(sharedObject_OnConnect);
  Red5SharedObject.OnDisconnect += new DisconnectHandler(sharedObject_OnDisconnect);
  Red5SharedObject.NetStatus += new NetStatusHandler(sharedObject_NetStatus);
  Red5SharedObject.Sync += new SyncHandler(sharedObject_Sync);
  Red5SharedObject.Connect(Red5NetConnection);
    网络回调函数设置完毕之后,connent咱们的Red5NetConnection,共享对象也就设置成功了。

    对于回调函数的代码,接收回调状态的类型值为NetStatusEventArgs,我们如何获取状态代码呢?还是举个例子:

private void Red5NetConnection_NetStatus(object sender, NetStatusEventArgs e)
 {
     string level = e.Info["level"] as string;
     if (level == "error")
     {
        Trace.WriteLine("Error: " + e.Info["code"] as string);
     }
     if (level == "status")
     {
        switch (e.Info["code"] as string)
        {
           case "NetConnection.Connect.Success":

           break;
           default:
           break;
         }
         Trace.WriteLine("Status: " + e.Info["code"] as string);
      }
}
    上面的代码我只写了success的状态例子,像其他的状态,大家可以具体情况,具体写,嘿嘿~~~~

    然后是c#调用远程服务器端的方法,这里需要注意一下,如果想要传递object类型的对象的话,要使用dll里面的ASObject类型:

  ASObject obj = new ASObject();
  obj.Add("type", "1");
  obj.Add("ip", "1");
  obj.Add("name", "1");
  obj.Add("code", "1");
  obj.Add("no", "1");
  Red5NetConnection.Call("SendMsgToTeacher", null, new object[] { obj });
    null还是调用的回调函数,这里与前文一样,传的空,如果实际需要,也可以写一个回调函数进来。

    如果服务器端的参数接收不是Object,是String,这样我们就使用:

  Red5NetConnection.Call("SendMsgToTeacher", null, "123"});
    如果我们客户端用String,服务器端用Object的话,服务器能接收到吗?

    答案是可以!!只不过样子就变了,假设我们传递的是“123”,服务器用Object接,那么服务器接收到的是String,值是“{123}”,数组啊!!!!!!!!跟登录传参好像,有木有!!!

   对于服务器调用客户端方法,写法上与java是一样滴,如果是object类型的,或者是接收从flex端传递过来的多参数、object等对象,c#端参数要使用ASObject接收哦~

    写到这里,大家是不是发现用法和写法都与flex很像?嘿嘿,当作flex用就可以了,像共享对象Send消息,同步共享对象,都与flex是一样的。

    妥了~就先写到这里吧,有什么疑问,大家可以联系我哦~~~吼吼吼!!!!!!!!!!!!!




    



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值