Se ha denunciado esta presentación.
Se está descargando tu SlideShare. ×

XMPPクライアント・プログラミング

Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Cargando en…3
×

Eche un vistazo a continuación

1 de 36 Anuncio

Más Contenido Relacionado

Presentaciones para usted (20)

Anuncio

Similares a XMPPクライアント・プログラミング (20)

Más reciente (20)

Anuncio

XMPPクライアント・プログラミング

  1. 1. XMPPクライアント・プログラミング 神戸隆行(椎路ちひろ)Twitter: @ChihiroShiiji / FB: takayuki.kando 2016/04/03(第13回福岡市西区プログラム勉強会資料)
  2. 2. 自己紹介  神戸 隆行(かんど たかゆき)、PN. 椎路ちひろ(しいじ ちひろ) Twitter: @ChihiroShiiji / FB: takayuki.kando  出身は名古屋、趣味イラストとコスプレ  本業は九大の社会人博士課程で博士を取ろうとしながら研究開発に従事する有 期雇用の勤め人@百道浜  専門は流転中:  数値解析(のプログラミング・インターフェースの改良、修論@名大) →数式処理(のプログラミング・インターフェースの改良@某F研) →プログラム最適化(博士課程一回目の失敗@東工大) (2005年に仕事を紹介され福岡へ来た) →コンパイラ開発(Redefis、動的再構成可能プロセッサ向けコンパイラ) →SW/HW開発環境(IDE上からクラウド上の開発ツールを利用できるミドルウェア PTaaSの開発) http://www.qualiarc.com/?post_type=seihin&p=202  使用プログラミング言語:  最初はFORTRAN、大学以降はC++とC、今は主にJava、他は必要に応じてボチボチ  本日は趣味と仕事で利用しているXMPPのクライアント・プログラミング  幾つかのソースとサンプルをGitHub[ https://github.com/TakayukiKando/Lore ]に置いてます 2016/04/032 第13回福岡市西区プログラム勉強会
  3. 3. 本日の内容 2016/04/03第13回福岡市西区プログラム勉強会3  準備 1. XMPPサーバのインストール 2. XMPPユーザアカウントの作成 3. Smack APIライブラリのインストール  サンプルプログラム"EchoBot"  話かけるとオウム返ししてきて、以降無理やり5分毎に時報を 送ってくるやや迷惑なボット(自動クライアント)  Gist "EchoBot.java": https://gist.github.com/TakayukiKando/ca0c72a07bcdd04f 7a55595895ea296d
  4. 4. 本日のターゲット(赤破線枠内): XMPPネットワークの構造と機能 XMPP サーバ XMPP クライアント XMPP サーバ・コン ポーネント XMPP クライアント XMPP クライアント XMPP クライアント 他所のXMPP サーバ UserA UserB ボット(ユーザがおらず自動応 答するクライアント) サーバに機 能を追加する メッセージ等をルーティ ングする ユーザを認証する ユーザーアカウント情 報を管理する ユーザの連絡先リスト を管理する オフライン・メッセージを 保管する 実装ポリシー: クライアントはUIに専念 サーバ側に様々な機能を実現 することが推奨されている 2016/04/034 第13回福岡市西区プログラム勉強会
  5. 5. XMPPサーバのインストール 2016/04/03第13回福岡市西区プログラム勉強会5
  6. 6. Openfireサーバの特徴 2016/04/03第13回福岡市西区プログラム勉強会6  配布元: ignite realtime社、オープンソース  2016年4月2日現在の最新版は4.0.2  http://www.igniterealtime.org/projects/openfire/index.jsp  中小企業程度の規模までをターゲットとするXMPPサーバ  XMPPとその拡張について一通りの機能は実装されている  Web(9090番ポート)で設定用GUIが提供されている  というか設定手段はそれだけなので自動化する際には難がある  詳しくは「JMeterをWebでしか設定できないサーバの設定自動化に使 う」(福岡Javaツール勉強会資料)へ  http://www.slideshare.net/takayukikando/jmeterweb  Javaで書かれている  LinuxでもWindowsでも(未確認だけど多分Macでも)動く  Javaでサーバ機能を拡張するサーバ・コンポーネント作成可能  Windows版はインストーラ(.exe)あり  .rpm(Linux)、.deb(Debian)、.dmg(Mac)もある
  7. 7. インストール後入力を求められること 2016/04/03第13回福岡市西区プログラム勉強会7  localhostの9090ポートにWebブラウザでアクセスすると管理 画面(初回は初期設定画面)  Windowsでは起動ダイアログにあるLaunch Adminボタンでも可  サーバ名(サーバのDNS名)  Windows環境でDNS名割り当てなしの場合、localhostからテスト に使うだけであればはホスト名と同じにしておいても動く  以下の設定画面例はWindowsでホスト名と同じ"ostrich"と設定した場 合  管理者IDとパスワード  管理者ID(JIDの"@"の左側)とパスワードを決めておく  スキップした場合はユーザ名"admin"、パスワード"admin"となる  RDBの指定  内蔵(Embedded)の簡易DBを使う設定もあり  今回はlocalhostでテストに使いたいだけなのでこちらを選択  標準的にはPostgrsSQLを利用  インストーラーが入れてくれます
  8. 8. インストール後のログイン 2016/04/03第13回福岡市西区プログラム勉強会8  管理者のパスワードはインストール時に設定した物  スキップしてしまった場合  デフォルト管理者のユーザ名"admin"、パスワード:"admin"  ユーザ作成後はそのユーザ名とパスワードでログイン可  ユーザ名はJabbar IDの"@"より前の部分
  9. 9. ログイン後トップ画面 2016/04/03第13回福岡市西区プログラム勉強会9  Openfireの 最新版は 4.0.2  このスク リーンショッ トは3.7.0  今回操作 する部分は 変更なし
  10. 10. データベース設定の確認 2016/04/03第13回福岡市西区プログラム勉強会10 "Database"を選 ぶとこの画面に なる "embedded-db"になっていれば組 み込み簡易DBが使われている
  11. 11. XMPPユーザアカウント作成 2016/04/03第13回福岡市西区プログラム勉強会11
  12. 12. ユーザ登録前のおさらい: XMPPのID(Jabber ID、JID)  ユーザ・アカウント、ユーザが利用する個々の接続、サーバ、サー バの拡張機能といったものを一意に識別する名前  メッセージなどを配信する際に宛先として使用する  連絡先リストの識別子(ID)でもある  このようにユーザはクライアントの接続毎に識別できるため複数個所 からの接続が可能  一般形は:  <ユーザ名>@<サービス名>/<リソース名>  例:  xmpp.xgmtk.orgというDNS名のXMPPサーバ: xmpp.xgmtk.org  上記サーバのユーザkando: kando@xmpp.xgmtk.org  上記ユーザkandoが使うクライアント(リソース名client )からの接続: kando@xmpp.xgmtk.org/client  上記サーバの拡張コンポーネントchatroom: chatroom.xmpp.xgmtk.org  名称はXMPPがかつてJabberと呼ばれていたことによる 2016/04/0312 第13回福岡市西区プログラム勉強会
  13. 13. 新規ユーザ作成 2016/04/03第13回福岡市西区プログラム勉強会13  テストに利用するアカウントを作成  少なくとも1つあれば主だったクライアント機能のテストはできる  が、2つほど作っておくと分かり易いと思う ユーザ名。Jabber IDの"@"より左 側の部分。使える文字はメールの ユーザ名と同じ ニックネーム。任意の文字列。 省略可。 メールアドレス。省略可。 パスワード。XMPPログイン 時とWebUIのログインで共通 パスワード確認。パスワード と同じ文字列。 管理権限のある アカウントを作る 時にチェック "Create New User"を選ぶとこ の画面になる "User/Groups"の"Users"タブを選ぶ とユーザ管理画面
  14. 14. ユーザ登録後のユーザ一覧(User Summary) 2016/04/03第13回福岡市西区プログラム勉強会14  テスト用のユーザのRoster(連絡先リスト)を編集して相互に連 絡可能(Both)なように登録する  連絡先リストに関する操作をクライアントで行う場合は不要  今回のサンプルコードではその辺りは省いているので必要 編集するユーザの Editアイコンをクリック
  15. 15. 例:ユーザemiri.kの連絡先一覧 2016/04/03第13回福岡市西区プログラム勉強会15 3. Editアイコンをクリックすると表 示される属性ダイアログで subscriptionを編集してBoth にしておく 2. "Add New Item"でRosterにエ ントリを追加しておく 1. "User Options"の "Roster"を選ぶと この画面になる ※ 連絡先リストには別 サーバのJabber IDも 登録されるのでサーバ 名も含める
  16. 16. オマケ: Spark 2016/04/03第13回福岡市西区プログラム勉強会16  Openfireの提供元が提供するXMPPクライアント  Javaで書かれている  名前の似ているSparkWebはWebページ組み込み用のクライ アント  配布元: ignite realtime社、オープンソース  2016年4月2日現在の最新版は2.7.6  http://www.igniterealtime.org/projects/spark/index.jsp  Windows版はインストーラ(.exe)あり  .rpm(Linux)、.deb(Debian)、.dmg(Mac)もある  クライアント・プログラミングに必須ではないがサーバの 動作を確認したい時など、比較用にあると便利
  17. 17. Smack APIライブラリの インストール 2016/04/03第13回福岡市西区プログラム勉強会17
  18. 18. クライアント用ライブラリSmack API 2016/04/03第13回福岡市西区プログラム勉強会18  配布元: ignite realtime社、オープンソース  2016年4月2日現在の最新版は4.1.6  http://www.igniterealtime.org/projects/smack/index.jsp  DL  http://www.igniterealtime.org/downloads/download- landing.jsp?file=smack/smack_4_1_6.zip  http://www.igniterealtime.org/downloads/download- landing.jsp?file=smack/smack_4_1_6.tar.gz  Javaで書かれたクライアント用ライブラリ  一通りの機能は揃っている  自分で拡張機能の実装でもしない限りは、XMLパーサを呼んでXML 要素をパース&生成する必要はない  Java 7 SE以上、Java 8 SEでも動く
  19. 19. Smack APIのインストール 2016/04/03第13回福岡市西区プログラム勉強会19  環境に応じて.zipか.tar.gzファイルをダウンロード&展開  必要な.jarファイルにクラスパスを通す  smack-core.jar …コア部分  smack-extensions.jar …拡張部分  smack-debug.jar …デバッグ用拡張  Smack APIをソースからコンパイルする場合  GradleやMavenを依存の自動解決をしないならばXml Pull Parser(詳細は付録に)のインストールが必要  Xml Pull Parser: http://www.xmlpull.org/
  20. 20. サンプル・プログラム EchoBot 2016/04/03第13回福岡市西区プログラム勉強会20
  21. 21. XMPP/Smack APIプログラミングの基本 2016/04/03第13回福岡市西区プログラム勉強会21  XMPPのポリシ  複雑な機能はサーバ側で実装  クライアントはUIの提供に徹する  サービスの類は本当はボットとか作らずにサーバコンポーネントにする のが望ましい  今回はサンプルなのでUIを省いてメッセージ処理に集中するためボット を作成  Smack APIの基本  接続を表すXMPPConnectionオブジェクトが中心  コネクションに紐づけられた各種マネージャを介してXMPPの実装にア クセスする  基本はリスナ登録を通じたイベント・ドリブンなプログラミング  一応、フィルタとコレクタを使って着信を待つスタイルもあります  タイムアウトが実現できるので返信を待つような場合に使われる  プロトコル実装上、返信を待つ必要がある際に良く使われる  今回は利用しなかった
  22. 22. EchoBot 2016/04/03第13回福岡市西区プログラム勉強会22  仕様  自動クライアント  ログイン情報はプロパティファイルresource/echo.propertiesで与え る  標準入力から"quitn"が入力されると終了  ボットのプレゼンス情報(時間表示付き)を30秒ごとに更新  メッセージを送ると同文を返信する  一度メッセージを送られるとその相手へ5分毎の時報を送信  ソース  Gist "EchoBot.java": https://gist.github.com/TakayukiKando/ca0c72a07bcdd04f 7a55595895ea296d
  23. 23. EchoBot動作例 2016/04/03第13回福岡市西区プログラム勉強会23  私の手製のXMPPクライアントから見た例 ← プレゼンス 表示画面 → 会話画面
  24. 24. EchoBotのプロジェクト構成と EchoBotクラスの構造 2016/04/03第13回福岡市西区プログラム勉強会24  下:プロジェクトの構成  パッケージ構造とecho.properties、 参照ライブラリに注目  右:クラスの構造
  25. 25. main() 2016/04/03第13回福岡市西区プログラム勉強会25 メインスレッドを待機させる ログインに必要な情報を 取得する メッセージ処理本体  ここではサボってますが終了前にconnectionのdisconnect()メソッドを呼んで接続 を切断しましょう
  26. 26. loadSettings() 2016/04/03第13回福岡市西区プログラム勉強会26  プロパティを読み込む何時ものアレ
  27. 27. EchoBotコンストラクタ 2016/04/03第13回福岡市西区プログラム勉強会27  XMPPConnectionクラスのオブジェクトがクライアント・プログラミングの中心  基本機能はconn.getAAAManager()、拡張機能はXXX.getXXXManager(cconn)で各 機能のマネージャーを取得してそれを操作することで実現できる  マネージャーはコネクションと紐づけられているので何度取得しても基本的に同じオブ ジェクトが返る  保存しておかなくてもいい 接続~ログイン デバッグモー ド指定(opt.) 自身をチャッ トメッセージ のリスナとし て登録 時報機能開 始 Presence更 新開始 chatセッションを 保持するリスト newする時に参 照される リソース名に自身のクラス名を利 用(同一アドレスから一個しか接 続できない)
  28. 28. ChatListenerとしてのメソッド 2016/04/03第13回福岡市西区プログラム勉強会28  1対1のチャットセッションが開始された際に呼ばれる  引数  Chatオブジェクトはセッションを表す  createdLocally引数は自身が開始したセッションである時にtrue  動作  自身をメッセージリスナとしてChatオブジェクトに登録  時報発信のためのリストに登録
  29. 29. MessageListenerとしてのメソッド (エコー機能の実現) 2016/04/03第13回福岡市西区プログラム勉強会29  セッションでメッセージが着信した際に呼ばれる  引数  Chatオブジェクトはメッセージが届いたセッションを示す  Messageオブジェクトはメッセージ  XMPPのMessageスタンザを表すオブジェクト  送信者(From)はXMPPサーバが付けるのでクライアントによる詐称はできない  クライアントが付けて送っても上書きされる  宛先(To)、送信者とタイムスタンプ、本文以外に付加的なフィールドが幾つかある  スレッド識別子とかムード情報とか、言語情報とか、……、etc. 送信者を取り出 す 送信者へメッセージを送り返す getBody()でメッセージ本文が取れる のでそれを渡してオウム返しさせてい る エラーはログを 吐いて黙殺
  30. 30. setTimeSignal() (時報機能の実現) 2016/04/03第13回福岡市西区プログラム勉強会30  引数intervalは時報間隔のミリ秒  EchoBotのstaticなタイマー(TIMER)のscheduleAtFixedRate()で 開始時刻と時間間隔を指定して一定時間ごとにTimerTaskを実行 させる  TimerTask内では現在時刻を取得、フォーマットして sendMessageToAll()を呼び出す 時報開始時刻の設定。 切りのいい時刻になるよう、現在時刻から 分、秒、ミリ秒を0に設定。
  31. 31. sendMessageToAll() (リストに記録された全セッションへの同報) 2016/04/03第13回福岡市西区プログラム勉強会31  ChatListenerのメソッドでリストに記録しておいた全セッ ションへの同一メッセージの送信(同報)
  32. 32. setPresenceUpdater() (Presence更新機能の実現) 2016/04/03第13回福岡市西区プログラム勉強会32  引数intervalはPresence更新間隔のミリ秒  EchoBotのstaticなタイマー(TIMER)の scheduleAtFixedRate()で開始時刻(現在)と時間間隔 を指定して一定時間ごとにTimerTaskを実行させる  TimerTask内では現在時刻を取得、フォーマットして sendPresence()を呼び出す
  33. 33. sendPresence() (Presenceの送信) 2016/04/03第13回福岡市西区プログラム勉強会33  引数statusはPresenceに表示する任意のテキスト  現況を簡潔に表す短文  PresenceはXMPPのPresenceスタンザを表すオブジェクト  Typeは通常の状態の表示に使うのはavailable(接続中), unavailable(非接 続)の2種  残りのsubscribe, subscribed, unsubscribe, unsubscribed, errorは連絡先リストへの 登録、解除のプロトコルに利用される。  Modeはchat(会話歓迎), available(接続している), away(離席中), xa(長 時間の離席), dnd(Don't disturb.忙しい)の5種類  Messageスタンザと同じく付加的なフィールドが幾つかある  Presenceスタンザは連絡先リスト全体に送られるのでできるだけ小さく するのが望ましい
  34. 34. まとめ XMPP/Smack APIプログラミング 2016/04/03第13回福岡市西区プログラム勉強会34  XMPPのポリシ  複雑な機能はサーバ側で実装  クライアントはUIの提供に徹する  サービスの類は本当はボットとか作らずにサーバコンポーネントにする のが望ましい  今回はサンプルなのでUIを省いてメッセージ処理に集中するためボット を作成  Smack APIの基本  接続を表すXMPPConnectionオブジェクトが中心  コネクションに紐づけられた各種マネージャを介してXMPPの実装にア クセスする  基本はリスナ登録を通じたイベント・ドリブンなプログラミング  一応、フィルタとコレクタを使って着信を待つスタイルもあります  タイムアウトが実現できるので返信を待つような場合に使われる  プロトコル実装上、返信を待つ必要がある際に良く使われる  今回は利用しなかった
  35. 35. 付録 2016/04/03第13回福岡市西区プログラム勉強会35
  36. 36. XML Pull Parserについて  Xml Pull Parser  http://www.xmlpull.org/  実装例  kXML  Web: http://www.kxml.org/  SourceForge(JARファイル): https://sourceforge.net/projects/kxml/  MXP1(Smackが使っているが、ダウンロードURLがリンク切 れ)  http://www.extreme.indiana.edu/xgws/xsoap/xpp/mxp1/ 2016/04/0336 第13回福岡市西区プログラム勉強会

×