您的位置:首页 > 编程语言 > C#

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

2017-06-21 14:31 603 查看
http://blog.csdn.net/z3237109/article/details/52483898

    啊呀,今天登录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添加我们用于测试的让客户端调用的服务器方法:

[java] view
plain copy

public void SendMsgToTeacher(Object msg) {  

  

    }  

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

[java] view
plain copy

public void SendMsgToTeacher(String msg) {  

  

    }  

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

[java] view
plain copy

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类型的对象了:

[plain] view
plain copy

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回调函数中):

[plain] view
plain copy

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,我们如何获取状态代码呢?还是举个例子:

[plain] view
plain copy

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类型:

[plain] view
plain copy

ASObject obj = new ASObject();  

obj.Add("type", "1");  

obj.Add("ip", "1");  

obj.Add("name", "1");  

obj.Add("code", "1");  

obj.Add("no", "1");  

[plain] view
plain copy

Red5NetConnection.Call("SendMsgToTeacher", null, new object[] { obj });  

    null还是调用的回调函数,这里与前文一样,传的空,如果实际需要,也可以写一个回调函数进来。

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

[plain] view
plain copy

Red5NetConnection.Call("SendMsgToTeacher", null, "123"});  

    如果我们客户端用String,服务器端用Object的话,服务器能接收到吗?

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

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

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

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

    



顶1
踩0

 

 

上一篇【C#】关于右下角托盘图标以及气泡使用的注意事项

下一篇【Red5】OBS(0.15.4)+Red5(1.0.7)视频直播(一)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: