SIP Servlet入门教程及例子

来源:互联网 发布:mac 下安装ant 编辑:程序博客网 时间:2024/04/30 11:09

作为一个SIP Servlet Tutorial,这个文档主要描述了在JavaEE平台下如何开发基于SIP协议的应用服务。当然这个教程也包含了如何将JavaEE技术与SIP应用程序集成。
这个教程主要涉及到的软件有:
1. JavaSE 5.0
2. Glassfish and Sailfin(这是目前为止,我知道的唯一的一个开源的java sip servlet 容器)
3. Netbeans IDE(主要是在sailfin的安装包中有Netbeans的插件,所以使用NB)
4. X-Lite Soft Phone 或者MyFreesipphone
5. Apache Ant
这里就不多介绍SIP协议了,直接进入主题。
熟悉web开发的人基本都知道Http request 和 http Response 两个对象。
对应的,SIP也有对应的对象。
SIP Request
常见SIP Request Action

  • INVITE 请求初始化一个session
  • ACK 回应INVITE请求,是(acknowledges的简写)
  • BYE 请求关闭连接
  • CANCEL 取消所有未处理的action,但是不释放连接
  • REGISTER 向服务器注册一个地址,或者说,客户端向服务器发送一个注册请求


  • 什么是SIP Servlets?
    SIP Servlet 是一个 基于Java 语言的 server-side 组件,就类似于Java Servlet 一样,只不过SIP Servlet 需要运行在 SIP Servlet 容器中。
    而且SIP Servlet主要用来处理SIP请求,而Servlet用来处理HTTP请求。
    HTTP Servlet 与 SIP Servlet的不同之处:
    1. HTTP Servlet 都会有一个context对象,也就是每个Servlet都有一个上下文的概念。而SIP Servlet没有。
    2. HTTP Servlet 通常会返回一个HTML 页面或者某种形式的字符串(比如JSON),而SIP请求通常只是起到连接服务器与客户端的作用。
    3. SIP 是一个P2P的协议,所以服务器端同样可以向客户端发送SIP请求。
    4. SIP Servlet通常只是扮演一个代理的角色,最终的请求(客户端的请求)会发送到另一个已注册的SIP客户端。而HTTP Servlet会返回给客户端一个HTTP response。
    5. SIP协议类似于长连接,但是一个无状态的链接,所以它可以返回个客户端多个相互独立的response,而HTTP是一个无状态的协议,一个Request对一个Response。
    6. SIP 请求可以是一个异步的请求。这一点取决于上一个特性。
    关于SIP Servlet的annotation。
    Annotation 描述
    @SipServlet 标示这是一个SIP Servlet
    @SipListener 标示这个一个Sip Listener
    @SipApplication 用来定义一组SIP Servlets
    @SipApplicationKey 为一个SIP请求或者一个SIP session分配一个SipApplicationSession
    比如:

     

    @SipApplication 这个注释一般都用在包上。
    比如

     

    而@SipApplicationKey这个注释需要使用在方法上,而且这个方法需要满足以下条件:
    1. Public method
    2. Static method
    3. Return a String
    4. 方法的参数必须是SipServletRequest 类型
    5. 传入的参数不可变
    例如:

     

    在一个Sip application中只能有一个SipApplicationKey。
    SIP Factory
    SIP Factory 是一个Servlet Factory,也就是说所有的SIP请求进入SIP容器后,都要通过SIP Factory来创建一个Servlet实例。所以SIP Factory是整个SIP容器的入口。如果想调用容器中的其他资源,可以通过SIP Factory来调用。而调用的方法包括依赖注入和”查找”两种方式。
    看例子:

     

    SIP Session
    SIP协议是一个无状态协议,所以一个response只能对应一个request(虽然一个request可以对应多个response)。也就是说多个request之间无法共享数据。
    但是SIP Session提供了一种比较便捷的方式,用来存储request之间的共享数据。而这种方式非常类似于HTTP servlet中的Session对象。
    但是与HTTP Session不同的是,在SIP应用中还有一个SIP ApplicationSession对象,这个东西很强大,它可以关于整个应用的session信息。
    除此之外,还有个SipSessionUtil可以使用。使用方法和SIP Factory类似:

     

    SIP Listeners
    SIP application Listeners 就是用来监听SIP相关事件的Java Servlet listeners。它需要实现SIPServletListener接口。同时在其类上标注上Annotation用于简化部署。
    比如:

     

     

    Back-to-Back User Agent Applications
    一个back-to-back user agent(B2BUA)本身就是一个应用程序,同时它还是一个工具,很类似于代理。用于将一个客户端请求,转发给另一个客户端。而javax.servlet.sip.B2buaHelper就是一个实现这种功能的帮助类。

    以上内容翻译自SUN的SIP Servlet Tutorial文档。
    下面是我自己写的一个简单的sip程序。

     

    原创粉丝点击