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看效果了.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章