第12回独習Javaゼミ 12章セクション3~4 発表者 直江 宗紀 ネットワークプロトコル(1) ネットワーク通信 プロトコル体系OSI参照モデル 下層から上層まで7層を持つ TCP/IPプロトコル 世界で一般的に用いられるプロトコル 4層構造 ネットワークアクセス層 ネットワーク層(IP) トランスポート層(TCP、UDP) アプリケーション層 ネットワークプロトコル(2) 図1 TCP/IPモデルと各層で扱うデータの名前 ソケット ソケットとは プロトコルアクセス可能な代表的論理インターフェイス 主に2つの意味で用いられる APIの意味でのソケット(またはソケットAPI) TCPによるポイントツーポイント接続の一端(エンドポイント) ソケットの種類 UDPの通信:データグラムソケット TCPの通信:ストリームソケット 下位のプロトコルで用いるソケットもあるがここでは省く 12.3 データグラムソケットと データグラムパケット(1) データグラムソケット TCP/IPプロトコルのサービスに対応するソケット データグラムパケット TCP/IPプロトコルにおけるUDPを利用する場合の送 受信データ (本節ではUDPを用いる場合の送受信プログラム) 12.3 データグラムソケットと データグラムパケット(2) TCPとUDPの違い TCP(コネクション型) コネクション型のサービスを提供 信頼性向上のためデータ欠落の発生時の再送を要求 その際、欠落データを破棄、等 UDP(ノンコネクション型) ノンコネクション型のサービスを提供 データ欠落監視を行わず、簡易的データ送受信を提供 データ欠落しても良いデータ(ストリーミングメディアデータ等) のやり取りに良く用いられる 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) void setData(byte buffer[]) bufferにデータをセットする void setLength(int size) iaにアドレスをセットする 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) プログラム例(送信) 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) プログラム例(送信:続き) DatagramPacket dp=new DatagramPacket(buffer,buffer.length,ia,port) ; ds.send(dp) ; } catch(Exception e){ e.printStackTrace() ; } } } このプログラムを使って、データグラムパケットを送信する。 この送信したデータを受け取るためのプログラムを次頁に示す。 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) プログラム例(受信:続き) 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 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」の場合 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) ; }
© Copyright 2024 ExpyDoc