第12回独習Javaゼミ 12章セクション3~4 発表者 直江 宗紀
ネットワークプロトコル(1) ネットワーク通信 TCP/IPプロトコル プロトコル体系OSI参照モデル 下層から上層まで7層を持つ 世界で一般的に用いられるプロトコル 4層構造 ネットワークアクセス層 ネットワーク層(IP) トランスポート層(TCP、UDP) アプリケーション層
ネットワークプロトコル(2) 図1 TCP/IPモデルと各層で扱うデータの名前
ソケット ソケットとは ソケットの種類 プロトコルアクセス可能な代表的論理インターフェイス 主に2つの意味で用いられる APIの意味でのソケット(またはソケットAPI) TCPによるポイントツーポイント接続の一端(エンドポイント) ソケットの種類 UDPの通信:データグラムソケット TCPの通信:ストリームソケット 下位のプロトコルで用いるソケットもあるがここでは省く
12.3 データグラムソケットと データグラムパケット(1) 12.3 データグラムソケットと データグラムパケット(1) データグラムソケット TCP/IPプロトコルのサービスに対応するソケット データグラムパケット TCP/IPプロトコルにおけるUDPを利用する場合の送受信データ (本節ではUDPを用いる場合の送受信プログラム)
12.3 データグラムソケットと データグラムパケット(2) 12.3 データグラムソケットと データグラムパケット(2) TCPとUDPの違い TCP(コネクション型) コネクション型のサービスを提供 信頼性向上のためデータ欠落の発生時の再送を要求 その際、欠落データを破棄、等 UDP(ノンコネクション型) ノンコネクション型のサービスを提供 データ欠落監視を行わず、簡易的データ送受信を提供 データ欠落しても良いデータ(ストリーミングメディアデータ等)のやり取りに良く用いられる
12.3 データグラムソケットと データグラムパケット(3) 12.3 データグラムソケットと データグラムパケット(3) 送受信の流れ 送信側 宛先アドレスの作成 ソケットの作成 データグラムパケットの送信(send) ソケットを閉じる 受信側 受信準備・データ受信
データグラムソケットと データグラムパケットにおけるクラス DatagramPacketとDatagramSocketが用意 ソケット操作は後者のクラス、パケット送受信は前者のクラスで行う DatagramPacketコンストラクタ DatagramPacket(byte buffer[],int size) DatagramPacket(byte buffer[] , int size , InetAddress ia , int port)
DatagramPacketクラス(1) クラスに定義されている主なインスタンスメソッド InetAddress getAddress() 着信データグラムの場合、発信元マシンのアドレスを、発信データグラムの場合、宛先マシンのアドレスを返す byte[] getData() データが含むバイトの配列を返す int getPort() ポートを返す int getLength() パケット内のバイト数を返す
DatagramPacketクラス(2) 定義されている主なインスタンスメソッド(続き) void setAddress(InetAddress ia) iaにアドレスをセットする void setData(byte buffer[]) bufferにデータをセットする void setLength(int size) sizeで指定したサイズのパケットをセットする void setPort(int port) portにポートをセットする
DatagramSocketクラス DatagramSocketコンストラクタ 主なメソッド DatagramSocket() DatagramSocket(int port) 例外処理:throws SocketException 主なメソッド void receive(DatagramPacket dp) throws IOException 着信データグラムの監視 void send(DatagramPacket dp) throws IOException データグラムの送信 void close() ソケットのクローズ
12.3 データグラムソケットと データグラムパケット(4) 12.3 データグラムソケットと データグラムパケット(4) プログラム例(送信) import java.net.*; public class test2 { public static void main(String args[]){ byte buffer[]=new byte[20] ; for(int i=0;i<20;i++){ byte temp=(byte)(0x0041+i) ; buffer[i]=temp ; } try{ InetAddress ia=InetAddress.getLocalHost() ; int port=Integer.parseInt(args[0]) ; DatagramSocket ds=new DatagramSocket() ;
12.3 データグラムソケットと データグラムパケット(5) 12.3 データグラムソケットと データグラムパケット(5) プログラム例(送信:続き) DatagramPacket dp=new DatagramPacket(buffer,buffer.length,ia,port) ; ds.send(dp) ; } catch(Exception e){ e.printStackTrace() ; このプログラムを使って、データグラムパケットを送信する。 この送信したデータを受け取るためのプログラムを次頁に示す。
12.3 データグラムソケットと データグラムパケット(6) 12.3 データグラムソケットと データグラムパケット(6) プログラム例(受信) import java.net.*; public class test1 { private final static int BUFSIZE=20 ; private final static int endTime=1000 ; static public void main(String args[]){ try{ int port=Integer.parseInt(args[0]) ; DatagramSocket ds=new DatagramSocket(port) ; byte buffer[]=new byte[BUFSIZE] ; long time=System.currentTimeMillis() ; while(true){ long temp=System.currentTimeMillis()-time ;
12.3 データグラムソケットと データグラムパケット(7) 12.3 データグラムソケットと データグラムパケット(7) プログラム例(受信:続き) if(temp>endTime)break ; DatagramPacket dp=new DatagramPacket(buffer,buffer.length) ; ds.receive(dp) ; String str=new String(dp.getData()) ; System.out.println(str) ; } catch(Exception e){ e.printStackTrace() ; 送信プログラムを受信すると… [出力結果] ABCDEFGHIJKLMNOPQRST
12.4 URL(1) URL URLクラス Uniform Resource Locator:URL Webリソース識別を目的とする 記述形式 protocol://host:port/file 例: http://127.0.0.1:8000/index.html URLクラス URLを用いるために用いるクラス
URLクラス URLコンストラクタ 主なメソッド URL(String protocol,String host,int port,String file) URL(String protocol,String host,String file) 例外:throws MalformedURLException 主なメソッド InputStream openStream() throws IOException URL入力ストリームをオープン String getFile() String getHost() int getPort() String getProtocol()
12.4 URL(2) プログラム例 import java.net.*; import java.io.*; public class test3 { static public void main(String args[]){ try{ URL url=new URL(args[0]) ; InputStream is=url.openStream() ; byte buffer[]=new byte[1024] ; int i ; while((i=is.read(buffer))!=-1)System.out.write(buffer,0,i) ; } catch(Exception e)e.printStackTrace() ;
12.4 URL(3) プログラム例について 前頁プログラムを実行する際のコマンドライン引数 「file:test.txt」の場合 「http://」等のURLアドレスの場合 指定URLの内容を取得し、表示 例:「http://yahoo.co.jp/」としたとき →指定サイトのページのHTMLデータが出力される
練習問題1 任意の値2つ用意し、受信側アプリケーションに渡して四則計算させるプログラムを作成せよ。結果を送信側に返す必要は無い。また、データグラムを送信したマシンのインターネットアドレス及びポートも計算結果と共に表示させよ。
練習問題2 GoogleサイトTop(http://www.google.co.jp/)からHTMLデータを取得し、そのデータの中で改行タグ(<br>)が幾つ使われているのかを検証し、使用回数を表示するプログラムを作成せよ。 (ヒント:String型でデータを読む例) while((i=is.read(buffer))!=-1){ String temp=new String(buffer,0,i) ; }