SIP Servlets规范( JSR116 , Java Community Process ),

SIP Servlets规范( JSR116 , Java Community Process ), 提供了一系列的Java API和一个基于容器(Container)/应用服务器(Application Server)的开发模型, 用于提高服务器端SIP应用的开发效率. SIP Servlets同样基于

SIP Servlets规范( JSR116 , Java Community Process ), 提供了一系列的Java API和一个基于容器(Container)/应用服务器(Application Server)的开发模型, 用于提高服务器端SIP应用的开发效率.
 
SIP Servlets同样基于Java Servlet架构, 其API归属于javax.servlet.sip包, 和javax.servlet.http同样扩展自javax.servlet. 不同的是, HTTP Servlets通过Servlet架构实现了HTTP协议, 而SIP Servlet实现了SIP协议.

通过SIP Servlets, 开发人员可以非常简单的开发出复杂的SIP应用程序, 就像HTTP servlets在WEB应用开发中起到的作用一样.
一组SIP Servlets连同资源和部署描述文件打包后部署并运行在一个容器或SIP应用服务器上的. 容器提供了例如会话状态管理, 事务管理, 重发, 网络连接, 消息调度, 线程管理, 资源管理, 应用程序管理等服务. 应用程序中只需包含高级的消息处理和业务逻辑, 开发人员不再需要在协议本身上投入过多精力, 这使SIP服务的开发成为一件轻而易举的事情.

下面对HTTP serlvet和SIP servlet做了一点比较:   HTTP SIP Servlet class HttpServlet SipServlet Session               HttpSession SipSession Application package war sar Deployment Descriptor web.xml sip.xml

SIP serlvets继承自javax.servlet.sip.SipServlet, 这个类同HttpServlet一样, 继承自javax.servlet.GenericServlet. SipServlet通过重写的service(ServletRequest request,
ServletResponse response)方法来处理不同的SIP消息.

由于SIP协议是异步的, 所以service方法每次调用时, 其两个参数中只有一个是有效的, 而另一个是null, 例如, 如果收到的SIP消息是一个request, 那么第一个request参数有效, 而response参数为null, 反之亦然.
SipSerlvet中service方法的默认实现是把SIP消息交给不同的子方法处理. 对请求来说, 是doXXX()方法, 对响应来说是doXXXResponse()方法. 例如, doInvite(SipServletRequest request)方法处理INVITE请求, doSuccessResponse(SipServletResponse response) 处理所有的2XX响应. 通常, 通过重写SipSerlvet类的这些doXXX(), doXXXResponse()方法, 来实现SIP应用的业务逻辑.

创建响应:
在doXXX(SipServletRequest request)中, 可以通过调用javax.servlet.sip.SipServletRequest类的createResponse()方法来创建一个响应, 随后, 调用这个响应的send()方法,将其发送出去.

创建请求:
在一个SIP Servlet中创建一个请求有两种方式, SipSession类的createRequest()方法用于在已经建立的一个会话中创建请求, 创建的请求属于这个已经存在的SipSession. 另一种方法是
javax.servlet.sip.SipFactory 类的createRequest()方法. SipFactory是SIP Servlet API中提供的一个工厂接口, 用于创建Request, Address, URI, Applicaiton session对象, 它的具体实现是由容器提供的, 在SIP Servlet中, 只需要通过ServletContext类的getAttribute("javax.servlet.sip.SipFactory”) 就可以获得一个SipFactory实例。

下面是一个具体的例子:
这个例子是一简单的"Echo"应用, 它接收Windows Messenger发送的Instant Message消息, 再将收到的消息发送回Windows Messenger。

EchoServlet的呼叫流程如图:

Message flow between Windows Messenger and EchoServlet

编译EchoServlet需要servlet.jar和sipservlet.jar这两个jar文件在classpath中. sipservlet.jar可以在JSR116的发布包中找到

和HTTP Servlet应用一样, SIP Servlet应用同样需要一个部署描述文件-sip.xml. 下面是一个sip.xml的例子:
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sip-app
PUBLIC "-//Java Community Process//DTD SIP Application 1.0//EN"
"http://www.jcp.org/dtd/sip-app_1_0.dtd">

<sip-app>
  <display-name>SIP Servlet Sample</display-name>
  <servlet>
    <servlet-name>echo</servlet-name>
    <servlet-class>com.micromethod.sample.EchoServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>echo</servlet-name>
    <pattern>
      <or>
        <equal><var>request.method</var><value>REGISTER</value></equal>
        <equal><var>request.method</var><value>INVITE</value></equal>
      </or>
    </pattern>
  </servlet-mapping>
</sip-app>
 
明显和web.xml不同的就是用and, or, not, equal, exists, contains, subdomain-of这一系列标签代替了url-pattern. 通过这些标签的组合嵌套,形成了一个条件表达式,表明相应的servlet可以处理哪些SIP消息.
 
上面的sip.xml就表明了EchoServlet可以处理REGISTER和 INVITE请求. 注意的是, 请求的类型指的是创建会话的请求, 会话后续请求不再做这种条件判断,例如INVITE创建会话后,会话内的ACK, CANCEL, MESSAGE, BYE等消息会直接被判定为由接收INVITE请求的servlet处理。
 
为了方便部署, 需要将EchoServlet和sip.xml放入一个部署包中. 和HTTP Servlet应用类似, SIP Servlet应用使用SIP application archive (SAR). SAR文件其实就是JAR文件, 它的内部目录结构和WAR文件相同:
.../WEB-INF
   |-- classes
   | |-- blog
   |   |-- sample
   |     |-- sipservlet
   |       |-- EchoServlet.class
   |-- sip.xml
 
在上级目录执行jar cv0f echo.sar创建sar文件.
 
最后需要做的就是部署echo.sar, 目前提供SIP应用服务器免费下载的的似乎只有BEA和Micromethod, BEA的Weblogic SIP Server是基于它的Web Server实现的, 和J2EE结合比较紧密, 但相应配置运行较为复杂, Micromethod的SIPMethod Application Server相比之下是一个轻量级的产品, 配置部署运行都比较简洁,同时还提供一个方便开发SIP应用的Application Creation Environment和一些基于SIP Servlet技术的完整SIP基础应用,如Proxy Server, Presence Server等, 因此, 比较适合学习和开发使用.
本文中使用的就是Micromethod的SIPMethod Application Server, 下载安装后,将echo.sar拷贝到SIPMethod AS的sipapps目录, 最好把sipapps目录下其它的sar文件都删除,以免EchoServlet的servlet-mapping和其它应用中的servlet冲突. 接下来, 执行SIPMethod的bin目录下的startup.bat运行服务器, 在服务器启动过程中,echo.sar就会被解开.
 
通常情况下, 运行SIPMethod AS甚至不需要额外配置, 使用它的默认配置就可以运行, 高级的配置方式可以参考它的user-guide. 常见的问题是端口冲突, SIPMethod AS默认需要占用TCP5060, TCP8080, TCP47492, UDP5060这四个端口.
 
当SIPMethod Application Server启动完成后, 就可以用Windows Messenger看效果了.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值