Javaによるネットワーク処理

Download Report

Transcript Javaによるネットワーク処理

第6章 インターネットアプリケーション
6.1
6.2
6.3
6.4
6.5
インターネットアプリケーション
Javaによるネットワーク処理
電子メール
Webアプリケーション
チャットアプリケーション
6.2 Javaによるネットワーク処理
6.2.1 ネットワークアドレス処理
ネットワーク処理のためのAPI(Application Programming Interface )としての
java.net パッケージに InetAddress クラスが用意されている。
① InetAddress のクラスメソッド
■ getByName
: hostで指定された機器のIPアドレスを取得する。見つから
ない場合,UnknownHostException例外を発生させる。
[呼出し形式]
public static InetAddress getByName(String host) throws UnknownHostException
■ getLocalHost : このメソッドを呼び出すプログラムが動作しているコン
ピュータのホスト名を取得する。
[呼出し形式]
public static InetAddress getLocalHost() throws UnknownHostException
ネットワークアドレス処理(その2)
② InetAddress のフィールド値を取得するメソッド
■ getHostAddress : 10進数のドット付きIPアドレスを文字列として取得。
[呼出し形式]
public String getHostAddress()
■ getHostName
: InetAddressオブジェクトが表すホスト名とIPアドレス
を含む文字列を取得する。
[呼出し形式]
public String getHostName()
(注)InetAddress以外に, Inet4Address(IPv4用) ,Inet6Address(IPv6用)がある。
プログラム例
(プログラムが動作しているマシンのIPアドレスとホスト名を取得)
Import java.net.*;
// java.netパッケージのインポート
public class InetAddressTest {
public static void main(String[] args){
try { // このプログラムのローカルホスト名を取得
InetAddress hostinfo = InetAddress.getLocalHost();
System.out.println("host Info : " + hostinfo);
} catch(UnknownHostException e){} //見つからなければ無視
}
}
6.2.2 ストリーム型通信処理
TCPを用いるアプリケーションでは,コネクション確立後ストリームを使ってデータの送
受信を行う。ストリームのインターフェースはソケットという概念が用いられる。
① Socket クラス
[コンストラクタ]
■ public Socket(String host, int port) throws UnknownHostException, IOException
hostで指定されたコンピュータ上のポート番号portに対応するソケットを生成
し,通信先のコンピュータとのコネクションを確立する。
■ public Socket(InetAddress address, int port) throws IOException
addressで指定されたコンピュータ上のポート番号portに対応するソケットを生
成し,通信先のコンピュータとのコネクションを確立する。addressは,
InetAddressオブジェクトの生成による。
[通信の完了]
■ public void close() throws IOException
ソケットを閉じて通信を完了する。
サーバ用ソケット
② Server Socket クラス
[コンストラクタ]
■ public ServerSocket(int port) throws IOException
portで指定されたポート番号でクライアントからの接続を待ち受けるソケッ
トを生成する。
[通信の完了]
■ public void close() throws IOException
サーバソケットを閉じて通信を完了する。
[メソッド]
■ public Socket accept() throws IOException
クライアントから接続要求を受け取ったSocketオブジェクトを取得する。こ
のSocketオブジェクトによりデータ送受信を行う。
(例)クライアントから「Hello」という文字列をサーバに送り,
サーバ側で受信した文字列をコンソールに出力する
[クライアント側]
import
Import
public
public
try
java.net.*; // java.netパッケージのインポート
java.io.*;
// java.ioパッケージのインポート
class SimpleClient {
static void main(String[] args){
{ // Localhost,6000番のポートでSocketオブジェクトを生成する。
Socket socket = new Socket("localhost",6000);
// バッファ出力ストリームの生成
BufferedWriter out= new BufferedWriter(
new outputStreamWriter(socket.getOutputStream()));
out.write("Hello"); // 文字列"Hello"を出力
out.flush();
// バッファ出力を完了する。
out.close();
// 出力のクローズ
socket.close();
// ソケットをクローズ
} catch(IOException e){System.err.println(e);}
}
}
[サーバ側]
Import
Import
public
public
try
java.net.*; // java.netパッケージのインポート
java.io.*;
// java.ioパッケージのインポート
class SimpleServer {
static void main(String[] args){
{ // 待受けポート番号を6000番とする。
ServerSocket serverSocket = new ServerSocket(6000);
while(true){
// 接続要求を受け取ったクライアントの取得
Socket clientSocket = serverSocket.accept();
BufferedReader in= new BufferReader(
new InputStreamReader(clientSocket.getInputStream()));
String line = in.readLine(); // 1行文字列を入力
System.out.println(line);
// コンソールに表示
in.close();
// 入力のクローズ
clientSocket.close();
// ソケットをクローズ
serverSocket.close();
// ソケットをクローズ
}
} catch(IOException e){}
}
}
6.2.3 データグラム型通信処理
UDPを用いるアプリケーションでは,データグラムパケットを利用してデータの送受信
を行う。
① Datagram Socket クラス
[コンストラクタ]
■ public DatagramSocket() throws SocketException
DatagramSocketクラスオブジェクトは,生成時に利用可能なポート番号が割り
当てられる。ソケットが生成できない場合,SocketException例外が発生する(可
能性は低い)。
■ public DatagramSocket(int port) throws SocketException
portで指定したDatagramSocketクラスオブジェクトを生成する。ソケットが生
成できない場合,SocketException例外が発生する。例外発生は,指定したポート
番号がすでに使用されている可能性が高い。
データグラム型通信処理(その2)
[メソッド]
■ public void send(DatagramPacket p) throws IOException
データグラムパケットpを送信する。
■ public void receive(DatagramPacket p) throws IOException
データグラムパケットpを受信する。このメソッドはデータが到着するまでプロセスを
ブロックするので,データ受信以外の処理を行うにはスレッドとして扱う必要がある。
■ public void close() throws SocketException
DatagramSocketオブジェクトが使用しているポートを開放する。
データグラムパケット
データグラムパケットを用いるには,DatagramPacketオブジェクトを生成する必要が
ある。
②DatagramPacket クラス
[コンストラクタ]
■ public DatagramPacket(byte[] buff, int length)
データを格納するbyte配列buffとデータのバイト数lengthを指定して
DatagramPacketクラスオブジェクトを生成する。
■ public DatagramPacket(byte[] buff, int length,InetAddress address, int port)
データを格納するbyte配列buff,データのバイト数length,送信先のIPアドレ
スaddress,ポート番号portを指定してDatagramPacketクラスオブジェクトを生成
する。
6.2.4 マルチキャスト通信処理
■特定のグループに対してデータ配信を行うには,マルチキャストグループを指定する。
■マルチキャストグループは,クラスDのIPアドレスとポート番号で指定する。すなわち,
個別のコンピュータを指定することはできない。範囲は(224.0.0.0~239.255.255.0)。
■ マルチキャストによるパケットはすべてのコンピュータに対して発信され,受信コン
ピュータは,自分がマルチキャストグループに属している場合に限りパケットを受取
る。
■ マルチキャスト対応ルータで,かつマルチキャスト有効に設定されたルータだけがパ
ケットを通過させる。通常は通過させない。
MulticastSocketの利用手順
① マルチキャストソケットの生成(MulticastSocketコンストラクタを使用)
② マルチキャストグループへの参加(joinGroup メソッドを使用)
③ マルチキャストグループでのデータ送受信(send メソッド,receiveメソッドを使用)
④ マルチキャストグループからの離脱(leaveGroup メソッドを使用)
⑤ マルチキャストソケットを閉じる(close メソッドを使用)
MulticastSocket クラス(その1)
[コンストラクタ]
■ public MulticastSocket(int port) throws IOException
portで指定したポート番号を使用するマルチキャストソケットを生成する。
ソケットが生成できない場合,IOException例外が発生する。
[メソッド]
■ public void joinGroup(InetAddress mcastaddr) throws IOException
mcastaddrで指定されたマルチキャストグループに参加する。マルチキャスト
アドレス以外が指定された場合,IOException例外が発生する。
■ public void leaveGroup(InetAddress mcastaddr) throws IOException
mcastaddrで指定されたマルチキャストグループから離脱する。マルチキャス
トアドレス以外が指定された場合,IOException例外が発生する。
MulticastSocket クラス(その2)
■ public void send(DatagramPacket p) throws IOException
DatagramPacketオブジェクトpをマルチキャストグループに送信する。送信
データ,データの長さ,IPアドレス,ポート番号はパケットに含まれている。
■ public void receive(DatagramPacket p) throws IOException
マルチキャストソケットを通して,DatagramPacketオブジェクトpを受信する。
■ public void close() throws SocketException
マルチキャストソケットを閉じる。