Ocs开发技术心得

  本文作者:donegal 本文出自: murdercdh.tianya.cn, 转载请注明
  最近需要做一个服务器端对OCS的扩展接口,对于微软推出的OCS这套产品,意在整合即时通讯系统。当然就包括一系列的东西,以及一系列的产品的整合,在OCS上面做开发,首先要了解一下他的平台架构,OCS的架构分为中间层平台,服务器平台,用户端平台。利用这三个平台的API的话,理论上可以达到架构在统一沟通平台上的任何功能。当然,现在主要应用比较多的估计还是服务端,客户端,和Web Access端的。
  
  下面列出了所有的目前可以采用的分属不同块API.
   Unified Communications Managed API 1.0
   Unified Communications Client API
   Office Communicator API
   Communicator Web Access API
   Office Communications Server API
   Live Meeting Service API
  
  在客户端开发:个人感觉Ocs2007提供的UCCA比较好用,而且封装比较完善,虽然现在开发的资料比较少,但是仔细研究下SDK也能收获不小了。
  在服务端开发:个人感觉Ocs2007提供的UCMA比较不错,同样和客户端的开始包一样,也是托管的代码,在.net平台下做应用和快速开发的首选。
  
  

  
   由于我主要是做的服务端的开发,所以这里主要就是说的UCMA的一些东西,看了几天,和大家分享一些经验,有不对的地方还请大家指出。
  下面用这个图来说明一下UCMA的本质,封装在.net库里面的命名空间为Microsoft.Rtc.Signaling,其实个人感觉里面是对服务器的WMI的一些原消息的操作进行了封装,以达到简化开发的效果。所有的托管的API和中间封装层交互,其实真正的WMI的封装还是在图中所显示的Unified Communication Managed Code Middle-Tie Application,如下图.
  
  

  
   对于整个UCMA的开发,首先要了解这个库的基本类结构,如下面的图,几个比较关键的类是管理connection的,管理endpoint的,还有管理session的。
  我们先来说管理连接的,连接管理用来管理和维护终端到服务器的连接池,负责维护会话的通道,以及连接的身份验证。UCMA提供两种连接方式,
  一种是通过tcp连接,对应的类是RealTimeTcpServerConnectionManager,
  一种是通过tls安全连接,对应的类是RealTimeTlsServerConnectionManager,从下面的图可以看出来,这两个类都是集成自抽象类RealTimeServerConnectionManger,至于这两种连接的区别,大家可以参考SDK,这里只是简单的提一下,一种是信任加密的连接,一种就是简单的连接。
  这里还有一种方式,采用clientConnectionManager来创建一个连接,但是这样的话就不能对服务器的会话进行监听,只能简单的发送消息。
  
  其次来说是RealTimeEndPoint:
  endpoint有两种;
  一种是需要连接服务器的单点endPoint,对应的类是SIPENDPOINT
  一种是点对点的EndPoint。对应的类是SIPPeerToPeerEndPoint
  单点的EndPoint必须要在服务器验证存在,或者是有个服务代理的情况下才能建立的节点。它支持T LAN Manager (NTLM) 和 Kerberos 认证协议,
  点对点的EndPoint可以不需要在服务器存在的情况下创建,但是存在一定的局限性,由于不和真实的Server创建连接,那么就无法监听来自服务器的接入和接出的连接,只能限于本身和其他机器之间的通信,期间传送的信息是借助的一个外部绑定的服务代理,具体的实现方法还不知道。大概是规定了一套传输的内容格式,借此来进行识别,本质还是通过tcp协议发了写东西到xx地址去了。由于点对点的传输不需要服务器,那么传输消息的时候就可以在需要传输消息的时候建立一个连接,在消息发送完毕以后就关闭连接。
  
  所共同的地方是他们二者都继承于抽象类RealTimeEndPoint。里面有几个主要的功能函数这里要提一下,异步的发送消息函数,前一个是开始发送,后一个是结束发送,
  BeginSendMessage
  EndSendMessage
  而同时也有同步的方式,采用SendMessage,这里建议单独开一个线程来处理,要不然网络超时的时候系统程序会有比较长的等待
  下面是两个比较重要的事件,一个是MessageReceived,一个是SessionReceived,这里意思都很明确,就不多说了。
  
  

  
  
  最后说一下session吧,这里的session绝对不是asp.net里面的session,这里的session实际上是型号量的承载者,里面包含了消息头,消息体,成员等信息。按简单理解来说应该就是一个协议套吧。
  
  说了那么多废话,总结出以下几点:
  1. 创建服务端的程序可以根据需要选择ConnectManager的具体类,这样方便用于管理,基本上可以做到,连接提醒,连接消息截获,中断提醒,发送消息等等。
  2. 创建的相应的EndPoint可以用来模拟不同的节点,这样就可以应付不同消息量的接收或者发送的需求。
  3. 如果建立的是点对点的EndPoint可以不必连接到服务器就可以进行消息的发送,当然如果建立的是ClientConnectManager的话也可以不用配置到服务端的连接了。
  4. 所以说,再服务端开发基本就是一下几点:首先创建连接管理类,之后创建相应的endPoint类依附于连接管理类上面,之后根据需要开始程序,截获或者发送session,或者直接封装好的message,或者管理外来到节点的连接,回话。等等。
  
  小弟才疏学浅,看了那么几天大概就看出了那么一点肤浅的明堂,估计有些地方理解还有偏差的,英语水平有限,待以后有时间再加以研究,如果有不对的地方还请大家指出,相互交流。
   具体的层次结构如下图: