【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)视频直播(一)
啊呀,今天登录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)视频直播(一)
相关文章推荐
- 【c#、Red5】关于c#如何使用FluorineFx与Red5通信及相关
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- 关于C#的FTPRequest客户类如何使用通配符去服务器端匹配文件
- 关于如何使用DirectX11进行编程的相关问题
- 如何:使用匿名管道在本地进程之间进行通信(C#)
- 关于c#的事件如何使用
- 关于C#上位机的usb_hid通信相关问题说明
- 关于长沙理工大学如何使用路由器的一些相关事项
- C# 关于如何将字符串的地址赋给char*使用
- CSDN上一篇关于如何有效的使用C#读取文件的文章 很不错的技术文章
- 使用ActiveMQ进行C++与C#的通信6 - 相关资源(终)
- 关于C#中如何使用wmi获得操作系统信息?
- 关于C#如何使用Prodave(实战DllImport)
- 关于asp.net(c#),webconfig中如何定义一个字符串让所有页面共同使用?
- 使用asp.net和C#如何存取Sql Server2000中的Image(16)类型的字段?
- 如何有效的使用C#读取文件
- 如何使用 C# .NET 在 ASP.NET 应用程序中实现基于窗体的身份验证
- 如何使用.NET生成C#源代码
- 使用c#如何读取xml文件
- C#写的计数器控件 - 一个关于相对路径使用的问题