P2P Chat Program Using JXTA 情報科学部ディジタルメディア学科 01k1024 諸星 宏行
P2Pとは パソコン、PDA、携帯電話、ワークステーションなどの各デバイス(ピアという)同士が同時に通信しあう仕組みのこと 中央で一括処理するサーバなどを必要とせず、ピア同士でさまざまなリソースやサービスを提供しあうことが出来る
通信形態 ハイブリッド型 サーバが存在するP2P。クライアント側でリソースを保持し、サーバにリソースの所在を問い合わせる。リソースの提供はクライアント間で行う。 ピュア型 クライアント、サーバといった役割が存在せず、ピアのみで動作する
P2Pの利用 Distributed Processing 大規模なデータ処理を分割し、ネットワーク に散在するコンピュータで処理する Collaboration 複数の利用者の協調作業を支援する Storage ファイル交換やハードディスクの分散
JXTAの概要 P2Pを実現するためにSunが発表したプロトコル コンセプト 相互運用性(Interoperability) プラットフォーム非依存(Platform independence) OS、プログラミング言語、通信プロトコルなどに依存しない 利用性(Ubiquity) コンピュータ、PDA、携帯電話、サーバ、家電製品などの各デバイスで実装が可能
JXTAの構成要素(1) Peer・・・ネットワークを構成する最小単位 Peer Group・・・ピア群が集まって構成される Simple Peer・・・単一のエンドユーザのために働くピア Rendezvous Peer・・・他のピアやピアのリソースを発見するためのネットワーク上の場所を提供するピア Relay Peer・・・隔離されたプライベート内のピアとグローバル内のピアとの通信メカニズムを提供するピア Peer Group・・・ピア群が集まって構成される ピア群にサービスを提供するグループのことで、オープンなグループからセキュアなグループまで作成可
JXTAの構成要素(2) Service・・・ピアが利用する可能性のある基本機能 Pipe・・・ピアがお互いに通信するための伝送路 PeerService・・・ピアが提供するサービス PeerGroupService・・・ピアグループが提供するサービス Pipe・・・ピアがお互いに通信するための伝送路 Advertisement・・・ピア、パイプ、サービスなどさまざまなリソースを表わすXML文書 公開されているアドバタイズメントからどのリソースが利用できるかといった情報を知ることができる
Chat Application (JXTA) Peer Discovery Protocol 自身のリソースが記されているAdvertisementを公開する Advertisementを取得する Peer Binding Protocol メッセージをやり取りする伝送路の確立 パイプアドバタイズメントの作成と公開 アドバタイズメントの検索・発見 レスポンスメッセージからアドバタイズメントの取得 アドバタイズメントから In/Outputパイプを作成 アドバタイズメントから In/Outputパイプを作成 パイプを通じて メッセージのやりとり
Chat Application (JXTA) Advertisementの作成と公開 discSvc = netPeerGroup.getDiscoveryService(); pipeAdv = (PipeAdvertisement)AdvertisementFactory.newAdvertisement( PipeAdvertisement.getAdvertisementType() ); pipeAdv.setName( PIPE_NAME ); // パイプ名のセット pipeAdv.setPipeID( IDFactory.newPipeID( netPeerGroup.getPeerGroupID() ) ); // ID pipeAdv.setType( PipeService.PropagateType ); // パイプ種別をセット discSvc.Publish( pipeAdv, DiscoveryService.ADV ); // ローカルに公開 discSvc.remotePublish( pipeAdv, DiscoveryService.ADV ); // リモートに公開 Input/OutputPipeの作成 inPipe = pipeSvc.createInputPipe( pipeAdv, this ); // Inputパイプ生成 outPipe = pipeSvc.createOutputPipe( pipeAdv, TIME_TO_WAIT ); // Outputパイプ生成 Advertisementの検索 discSvc.getRemoteAdvertisements(null, DiscoveryService.ADV, null, null, 5, this);
Chat Application (JXTA) ResponseからAdvertisementを取得する public void discoveryEvent( DiscoveryEvent ev ){ // Advertisement発見時に呼び出される DiscoveryResponseMsg resMsg = ev.getResponse(); if( pipeAdv.getName().equals( PIPE_NAME ) && pipeAdv.getType().compareTo( PipeService.PropagateType ) == 0 ) createPipes( pipeAdv ); // Input, Outputパイプ作成メソッド Messageを送信する Message msg = pipeSvc.createMessage(); MessageElement = msg.newMessageElement( MSG_TAG_SENDER, // 送信者名の追加 new MimeMediaType( “text/plain” ), new ByteArrayInputStream( sender.getBytes() ) ); msg.addElement( messageElement ); // この後、メッセージ本体も同様に追加する outputPipe.send( msg ); Messageを取得する public void pipeMsgEvent( PipeMsgEvent evt ){ // メッセージ受信時に呼び出される Message message = evt.getMessage();
Chat Application(Server-Client) メッセージはサーバを介して送られる input.readUTF() output.writeUTF() input.readUTF() output.writeUTF() ・・・・・・・・ ・・・・・・・・ output.writeUTF() input.readUTF() output.writeUTF() input.readUTF() Server側 ServerSocketを生成し、Clientから要求を待つポートを設定する ServerSocket s = new ServerSocket( port, queueLength ); クライアントからの接続を待つ Soket connection = s.accept(); ストリームソケットに入力、出力ストリームを連結する DataInputStream input = new DataInputStream( connection.getInputStream() ); DataOutputStream output = new DataOutputStream( connection.getOutputStream() ); コネクションを閉じる Connection.close();
Chat Application(Server-Client) Socket connection = new Socket( serverAddress, port ); ストリームソケットに入力、出力ストリームを連結する DataInputStream input = new DataInputStream( connection.getInputStream() ); DataOutputStream output = new DataOutputStream( connection.getOutputStream() ); コネクションを閉じる Connection.close(); 参考文献名: C Magazine/2003年01号/P37~74 JXTAのすべて(日経BP) Java How to Program Vol.2(ピアソン)
Projext JXTAのインストール Project JXTA Demosをダウンロード http://www.jxta.org/ にアクセスする 一番上にある「Download Project JXTA Demos Now! myJxta Demo App and Latest Shell」を選択し、Windowsのincludes Java_VMをダウンロード Project JXTA Demosをインストール ダウンロードしたJXTAInst_VM.exeを選択し、全てデフォルトでインストールする JXTA Demoを動かしてみる スタート -> プログラム -> Jxta -> JXTA Shellを選択 初回起動時に設定を必要とするのでPeerName, UserName, Passwordを入力する Relay Setting でUse a Relayをチェックする Download relay and rendezvous lists から利用できるランデブーピアのIPをダウンロードする OKを押して起動
Projext JXTAのインストール Programmingをする http://www.jxta.org/project/www/Tutorials.html からProgrammers Guideをダウンロードしてみてください。 また、プログラミングにはクラスパスの再設定が必要です。 java -classpath C:\Program Files\JXTA_Demo\lib\jxta.jar;C:\Program Files\JXTA_Demo\lib\log4j.jar;C:\Program Files\JXTA_Demo\lib\beepcore.jar;C:\Program Files\JXTA_Demo\lib\jxtasecurity.jar;C:\Program Files\JXTA_Demo\lib\cryptix-asn1.jar;C:\Program Files\JXTA_Demo\lib\cryptix32.jar;C:\Program Files\JXTA_Demo\lib\jxtaptls.jar;C:\Program Files\JXTA_Demo\lib\minimalBC.jar; (実行Javaクラス名) また、この際バッチファイルなどを作っておくのも便利です