第6章 インターネットアプリケーション 6.1 インターネットアプリケーション 6.2 Javaによるネットワーク処理 6.3 電子メール 第6章 インターネットアプリケーション 6.1 インターネットアプリケーション 6.2 Javaによるネットワーク処理 6.3 電子メール 6.4 Webアプリケーション 6.5 チャットアプリケーション
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 java.net.*; // java.netパッケージのインポート Import java.io.*; // java.ioパッケージのインポート public class SimpleClient { public static void main(String[] args){ try { // 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 java.net.*; // java.netパッケージのインポート Import java.io.*; // java.ioパッケージのインポート public class SimpleServer { public static void main(String[] args){ try { // 待受けポート番号を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を用いるアプリケーションでは,データグラムパケットを利用してデータの送受信を行う。 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 マルチキャスト通信処理 ■ 特定のグループに対してデータ配信を行うには,マルチキャストグループを指定する。 6.2.4 マルチキャスト通信処理 ■ 特定のグループに対してデータ配信を行うには,マルチキャストグループを指定する。 ■ マルチキャストグループは,クラスDのIPアドレスとポート番号で指定する。すなわち,個別のコンピュータを指定することはできない。範囲は(224.0.0.0~239.255.255.0)。 ■ マルチキャストによるパケットはすべてのコンピュータに対して発信され,受信コンピュータは,自分がマルチキャストグループに属している場合に限りパケットを受取る。 ■ マルチキャスト対応ルータで,かつマルチキャスト有効に設定されたルータだけがパケットを通過させる。通常は通過させない。
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 マルチキャストソケットを閉じる。