第12回独習Javaゼミ
Download
Report
Transcript 第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) ;
}