OMCS 开发手册(03) -- 多媒体服务器
前面我们已经详细介绍了基于OMCS开发网络多媒体应用的客户端程序所必需掌握的内容,现在我们来看一下OMCS服务端的开发。对于使用者而言,OMCS的服务端就非常简单了,只要实现一个用户验证的接口,挂接到OMCS框架上,就可以了。OMCS多媒体服务器的主要职责有:
(1)统一管理所有多媒体设备的配置参数。
(2)管理所有在线的OMCS客户端。
(3)协助OMCS客户端之间建立P2P通道。
(4)在OMCS客户端之间转发信息。
(5)管理多人语音/视频的动态组。
一.IMultimediaServer接口
OMCS服务端的核心接口是OMCS.Server.IMultimediaServer,它将OMCS多媒体服务端的各个组件装配起来,构成一个整体运行。IMultimediaServer接口的定义如下:
/// <summary> /// OMCS多媒体服务器。 /// </summary> public interface IMultimediaServer { /// <summary> /// 关闭OMCS多媒体服务器。 /// </summary> void Close(); /// <summary> /// Guest过滤器。 当服务器转发某个Owner的语音视频数据给其对应的Guest时,可以在服务端控制只转发给其中的部分Guest。 /// </summary> IGuestFilter GuestFilter { get; set; } /// <summary> /// OMCS高级控制选项。 /// </summary> ServerAdvancedOptions Advanced { get; } /// <summary> /// 用于存放用户上传的白板课件的根目录。默认值为运行目录下的"Coursewares"文件夹。 /// </summary> string CoursewaresRootPath { get; set; } /// <summary> /// 获取在线用户的ID列表。 /// </summary> List<string> GetOnlineUserList(); /// <summary> /// 目标用户是否在线。 /// </summary> bool IsUserOnLine(string userID); /// <summary> /// 当前服务器所监听的端口。 /// </summary> int Port { get; } /// <summary> /// 当前在线用户的数量。 /// </summary> int UserCount { get; } /// <summary> /// 智能通道状态判定器是否开启。默认值为true。 /// </summary> bool AgileChannelBusyGuesserEnabled { get; set; } /// <summary> /// 客户端连接到服务器时,将触发此事件。 /// </summary> event CbGeneric<string> UserConnected; /// <summary> /// 客户端连接断开时,将触发此事件。 /// </summary> event CbGeneric<string> UserDisconnected; /// <summary> /// 当语音消息的接收者不在线时,将触发此事件。参数:语音消息接收者ID - 语音消息发送者ID - AudioMessage。 /// 注:实现群内语音消息时,可将语音消息接收者ID 设为null,AudioMessage.Tag设置为群ID。 /// </summary> event CbGeneric<string, string, AudioMessage> AudioMessagePostFailed; /// <summary> /// 当在服务端丢帧的时候,触发此事件。参数:MultimediaDeviceType - ownerID - guestID /// </summary> event CbGeneric<MultimediaDeviceType, string, string> FrameDiscarded; /// <summary> /// 发送语音消息给目标用户。 /// </summary> /// <param name="destUserID"> 语音消息的接收者ID</param> /// <param name="msg">语音消息</param> void SendAudioMessage(string destUserID, AudioMessage msg); /// <summary> /// 刷新指定白板的课件列表(将从目标白板对应的课件文件夹重新加载课件列表,并通知该白板的guest)。 /// </summary> /// <param name="whiteBoardID"> 目标白板的ID</param> void RefreshCoursewares(string whiteBoardID); /// <summary> /// 获取多人语音/视频组的成员。注意:返回的集合不可被修改。 /// </summary> List<string> GetMultiChatMembers(ChatType chatType, string groupID); }
通过 IMultimediaServer接口,我们可以获取在线用户、以及多人语音/视频组的相关信息;并可以通过该接口向在线用户发送消息(关于消息,我们后面章节会详细介绍)。
在二次开发时,我们可以通过MultimediaServerFactory的CreateMultimediaServer方法取得IMultimediaServer引用,然后将其宿留任何形式的程序中(像WinForm、Windows服务、甚至控制台程序等)。
/// <summary> /// OMCS多媒体服务器工厂,用于创建多媒体服务器实例。 /// </summary> public static class MultimediaServerFactory { /// <summary> /// 创建多媒体服务器实例。 /// </summary> /// <param name="port">监听的端口</param> /// <param name="userVerifier">用户帐密验证器</param> /// <param name="securityLogEnabled">是否记录详细的安全日志,一般在debug时使用</param> /// <param name="logger">日志记录器</param> static IMultimediaServer CreateMultimediaServer(int port, IUserVerifier userVerifier, bool securityLogEnabled = false, IAgileLogger logger = null);
}
port 参数用于指定当前OMCS服务器通过哪个端口提供服务(使用TCP协议)。
userVerifier 用于验证登录的客户端的帐号密码,如果帐号密码不正确,客户端多媒体设备管理器IMultimediaManager的Initialize方法将抛出异常。OMCS服务端开发唯一需要做的就是实现这个接口。
securityLogEnabled 参数用于指定是否记录安全日志,一般在调试程序的时候,将其设为true,而正式发布运行时,将其设为false。
logger参数用于记录安全日志的内容。
CreateMultimediaServer方法中另一个参数是OMCSConfiguration,其类图如下所示:
SystemToken 用于区分不同的基于OMCS开发的系统,并隔离它们。
OMCS的客户端也能设置SystemToken,如果客户端与服务端的SystemToken的值不一致,则客户端就无法成功登录到OMCS服务端。
二.默认的多媒体服务器
如果不需要用户验证,可以直接使用OMCS.Boosts提供的默认的多媒体服务器 OMCS.Server:
(1)使用OMCS提供的 IUserVerifier接口的默认实现类DefaultUserVerifier,其VerifyUser方法始终返回true。
(2)SystemToken的值为""。
如果需要验证用户帐号密码,或设定SystemToken,则可以将源码修改一下,实现IUserVerifier接口,并替换DefaultUserVerifier,然后重新编译发布。
(3)OMCSConfiguration其它项的设置可以在配置文件OMCS.Server.exe.config中进行修改。
<configuration> <appSettings> <!--服务器监听的端口--> <add key="Port" value="9900"/> <!--是否记录安全日志文件--> <add key="SecurityLogEnabled" value="false"/> <!--UserID的最大长度--> <add key="MaxLengthOfUserID" value="11"/> </appSettings> </configuration>
配置文件中除了可以设置OMCSConfiguration相关项外,还有其它几个设置项:
(1)Port 用于指定当前OMCS服务器通过哪个TCP端口提供服务。【将被传入MultimediaServerFactory的CreateMultimediaServer方法】
(2)SecurityLogEnabled 用于指定是否记录安全日志。【将被传入MultimediaServerFactory的CreateMultimediaServer方法】
(3)MaxLengthOfUserID 用于设定客户端登录帐号的最大长度,默认值为11,如果所需长度大于这个值,必需重新设定。
而且,客户端的设定的MaxLengthOfUserID必须同服务器一致,OMCS客户端可以通过调用GlobalUtil类的静态方法SetMaxLengthOfUserID来设定该值。
默认的OMCS.Server.exe以WinForm的形式宿留了IMultimediaServer对象。其运行起来后,如下图所示:
界面上显示了所有在线用户数量,启动时间、以及用户上下线的事件消息。
注意:OMCS多媒体服务器使用的是两个端口,一个是通过IMultimediaServer的构造参数指定的TCP端口,另一个是自动绑定的UDP端口(默认为TCP端口号加1)。
UDP端口是OMCS多媒体服务器内部集成的P2P服务器所使用的,用于协助客户端之间创建P2P通道。
三.下载
下载 OMCS多媒体服务器(项目源码位于OMCS.Boosts)。
就基于OMCS进行二次开发而言,在我们掌握了概述、多媒体设备管理器、多媒体连接器、多媒体服务器这些内容后,就已经足够了。后面我们会介绍使用OMCS的更多技巧,以及给出更多的demo来演示如何开发基于OMCS的网络多媒体应用系统。
--------------------------------------------------------------------------------------------------------------------
阅读 更多OMCS开发手册系列文章 。
Q Q:168757008
官网: www.oraycn.com