第12回独習Javaゼミ

第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) ;
}