サーブレットはHTTPだけじゃない!
NGN時代の有力な基盤技術? SIPサーブレット入門


ナレッジオンデマンド 宮下知起
2007/7/30


ソースコード・シーケンス図でSIPサーブレットをひも解く

 それでは、実際に簡単なSIPサーブレットのサンプルプログラムのソースコードおよびシーケンス図を見ながらSIPサーブレットを見てみましょう。

リスト1 サンプルコード
 1:  package test;

 2:  import javax.servlet.sip.SipServlet;
 3:  import javax.servlet.sip.SipServletRequest;
 4:  import java.io.IOException;

 5:  public class SimpleUasServlet extends SipServlet {

 6:      protected void doInvite(SipServletRequest req)
 7:      throws IOException {
 8:          req.createResponse(180).send();
 9:          req.createResponse(200).send();
10:
    }

11:
    protected void doBye(SipServletRequest req)
        throws IOException {
12:
        req.createResponse(200).send();
13:
        req.getApplicationSession().invalidate();
14:
    }
15: }

 このプログラムは、INVITEリクエストおよびBYEリクエストを実装した単純なUASのプログラムSimpleUasServlet(リスト1)とデプロイメント・ディスクリプタリスト2)の例です。

SIPサーブレットサンプルプログラムのシーケンス

 SimpleUasServletではINVITEリクエストに対応するdoInviteメソッドと、BYEリクエストに対応するdoByeメソッドがオーバーライドされており、図5で記載されているシーケンスが実装されています。

図5 サンプルプログラムのシーケンス図
図5 サンプルプログラムのシーケンス図

 SIPサーブレットコンテナがINVITEリクエストを受け取った際、デプロイ時に読み込まれているデプロイメント記述子のマッピングルールに沿って呼び出すべきサーブレットを特定します。

SIPサーブレットサンプルプログラムのデプロイメント・ディスクリプタ

 なお、デプロイメント・ディスクリプタ(HTTPサーブレットでいう、WEB-INF/web.xml)で定義されたservlet-mapping要素は、特定のサーブレットを呼び出すルールを定義します。リスト2は、リクエストがINVITEで、かつRequest-URIのホスト部分に「atmarkit.co.jp」文字列が含まれている場合に、SimpleUasServlet.doInviteを呼び出すという例です。

リスト2 デプロイメントディスクリプタ
<sip-app>
    <servlet>
        <servlet-name>sample</servlet-name>
        <servlet-class>test.SimpleUasServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>sample</servlet-name>
        <pattern>
            <equal>
                <var>request.method</var>
                <value>INVITE</value>
            </equal>
            <contains ignore-case="true">
                <var>request.from.uri.host</var>
                <value>atmarkit.co.jp</value>
            </contains>
        </pattern>
    </servlet-mapping>


SIPサーブレットサンプルプログラムを1行づつ見てみる

 それでは、リスト1を行単位で説明していきましょう。SIPサーブレットがHTTPサーブレットとよく似たプログラミングモデルを持ち、Javaプログラマは特別なスキルを身に付けることなくSIPを制御するアプリケーションを書けることが理解できるでしょう。

 1:  package test;

 パッケージ名を宣言します。

 2:  import javax.servlet.sip.SipServlet;
 3:  import javax.servlet.sip.SipServletRequest;
 4:  import java.io.IOException;

 SIPサーブレットプログラムに必要なパッケージをインポートしています。各クラスで定義されている各メソッドをこのプログラム内で使用できるようになります。

 5:  public class SimpleUasServlet extends SipServlet {

 SipServletクラスを継承します。

 6:      protected void doInvite(SipServletRequest req)
 7:      throws IOException {

 doInviteメソッドをオーバーライドします。INVITEメソッドを受信した際、このメソッドが実行されます。

 8:          req.createResponse(180).send();

 受信したINVITEに対して、ステータスコードが180(Ringing)のレスポンスを生成し、送信します。User1には、呼び出し音が流れます。

 9:          req.createResponse(200).send();
10:     }

 受信したINVITEに対して、ステータスコードが200(OK)のSIPレスポンスを生成し、送信します。

11:     protected void doBye(SipServletRequest req)
        throws IOException {

 doByeメソッドをオーバーライドします。BYEメソッドを受信した際、このメソッドが実行されます。

12:         req.createResponse(200).send();

 受信したBYEに対して、ステータスコードが200(OK)のレスポンスを生成し、送信します。User2が通話から切断されます。

13:         req.getApplicationSession().invalidate();

 通話が終了したため、SIPアプリケーションセッションを無効化します。

 いかがでしょうか? IP電話における相手の呼び出し、通話、切断という制御を上記のたった13行のプログラムで記述できます。

SIPサーブレットも試してみよう

 本稿では、HTTPサーブレットとの比較を中心に、SIPサーブレットの概要を説明しました。通信系プログラミングの世界に、HTTPサーブレットに極めて類似した開発スタイルを提供することを理解いただけたと思います。

サービス構築にはソフトウェアを開発するプラットフォームが重要

 NGNの登場によって、通信とITを融合したサービスを構築するためのSDPSoftware Development Platform)が重要になってきます。Javaであれば、開発者の確保、開発生産性、拡張性、メンテナンス性において優位であるため、SIPサーブレットのコンテナであるSIPアプリケーションサーバは、SDPの有力な候補になると予想されます。

SIPの企業内(エンタープライズ)での活用法

 SIPの企業内における活用は、例えばClick to Dial(相手のプレゼンス状態に応じて適切な番号にワンクリックで発信。例えば、着席中であれば内線電話に、外出中であれば携帯電話に)やIMインスタントメッセンジャー)、電話会議システムなどが挙げられます。

 こういったサービスをJavaで開発できるようになることで、企業内における情報系と音声系の連携・融合が容易になり、従来の発想になかった企業向けの新しいサービスやアプリケーションの登場が期待されます。

SIPサーブレットの時代が来るか?

 現在、SIPはNGNの標準に採用されているとはいえ、SIPサーブレットの実装はまだ多くはありません。SIPサーブレットを、無償でかつ日本語ドキュメントが整備された状態で評価できるコンテナは、国内ではBEAシステムズが提供するSIPアプリケーションサーバのみという状況です。

 SIPサーブレットの仕様自体も発展途上にあり、まだまだこれからの技術という状況ですが、遠くないSIP時代の到来を見据え、いまから評価してはいかがでしょうか。

参考サイト

参考文献

 本稿は筆者の許諾を得て「BEA WebLogic SIP Server 3.0J SIPアプリケーション構築ガイド」(日本BEAシステムズ著)を参考に執筆しています。

@IT関連記事

通信系サービスと情報系サービスを融合するJava
J2EE Watch(9) JCPで策定されたSIP Servletは通信系サービスと情報系サービスを融合したアプリケーションを構築する基盤であり、大きな可能性をもっている
Java Solution」フォーラム 2006/4/22
Javaで音声チャットアプリを作ろう
JavaでVoIPアプリケーションを作成するJavaテクノロジーとして注目されるJAIN SIPを使って音声チャットアプリを作成してみよう

前編 シンプルなSIPアプリケーションの構築 (2005/12/8)
後編 SIPアプリケーションを拡張する (2006/1/21)
Java Solution」フォーラム
次世代コミュニケーションを担うJAIN
VoIPをはじめとし、すべてのコミュニケーションがインターネットに集約されようとしている。そして、そのためのJava APIも誕生した

前編 マルチメディアを操るJava API登場 (2003/12/25)
後編 JAIN SLEEの機能を理解する (2004/2/7)

Java Solution」フォーラム
SIP:マイクロソフトがIP電話を面白くする!?
IPトレンド解説
 IP網と電話網を統合させるVoIPの、基盤技術の1つ「SIP」。 MSの新サーバでも対応が始まった、この音声や画像などを扱うプロトコルはなぜ重要なのか
Master of IP Network」フォーラム 2003/5/21
書籍で学ぶVoIPとSIP
IP Network書評 
IPによる音声通話の基礎テクノロジ「VoIP」、そのベースとして多用される通信プロトコル「SIP」。5冊の入門〜開発者向け解説書を紹介する
Master of IP Network」フォーラム 2003/9/12

3/3

 INDEX NGN時代の有力な基盤技術? SIPサーブレット入門
  Page1
  SIPサーブレットとは何か?
HTTPサーブレットとの類似点から見たSIPサーブレット
  Page2
  HTTPサーブレットとの相違点から見たSIPサーブレット
Page3
  ソースコード・シーケンス図でSIPサーブレットをひも解く
SIPサーブレットも試してみよう


Java Solution全記事一覧



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間