Java ネットワークの概要


Java ネットワーク API (java.net) は、次の機能を実行するためのインタフェース/クラスを提供します。

このドキュメントの目的は、java.net パッケージが提供する機能の高レベルな概要を説明することです。インタフェース、クラス、およびファクトリの詳細については、「Networking API」 を参照してください。ネットワークの基本的な概念については、「Java Tutorial」の「Trail: Custom Networking」を参照してください。

アドレス指定

java.net は、以下のアドレス関連クラスを提供します。

IP アドレス指定には、InetAddressInet4Address、および Inet6Address という 3 つのクラスが提供されています。InetAddress は、32 ビットまたは 128 ビットの符号が付けられてない数値で、IP プロトコルによって使用される IP アドレスを表します。IP プロトコルは、TCP や UDP の構築基盤となる下位レベルのプロトコルです。32 ビットの IPv4 アドレスを表すために、Inet4Address が提供されています。IPv4 アドレスは、nnn.nnn.nnn.nnn というよく知られる形式で指定します。n は整数を示し、たとえば 129.250.35.250 のようになります。このクラスは InetAddress のサブクラスです。128 ビットの IPv6 アドレスを表すために、Inet6Address が提供されています。このクラスも InetAddress のサブクラスです。

InetAddress から Inet4Address および Inet6Address への論理フローを示したフローチャート

ソケットアドレス指定には、SocketAddressInetSocketAddress という 2 つのクラスが提供されています。SocketAddress は、特定のプロトコルに依存しない抽象的なソケットアドレスです。このクラスは、特定プロトコル用のサブクラスの作成を目的としています。次の InetSocketAddress は、このサブクラスの例です。InetSocketAddress は、SocketAddress のサブクラスで、IP ソケットアドレスを表します。このアドレスは、IP アドレス (例 129.250.35.250) とポート (例 80)、ホスト名 (例 coastnews.com) とポート (例 1000)、またはポートだけ (例 1010) を含むことができます。ポートだけの場合、ワイルドカードの IP アドレスと想定されます。

SocketAddress と InetSocketAddress の間の論理フローを示す図

TCP 接続の確立

以下のクラスは、通常の TCP 接続の確立に関係するクラスです。

クライアントとサーバ間の単純な接続の場合、通常、ServerSocketSocket だけで必要な機能はすべて提供されます。

ServerSocket は、サーバ上でクライアントからのサービス要求を待機するソケットを表します。Socket は、サーバとクライアント間の通信のエンドポイントを表します。サーバは、サービスの要求を受け取ると、クライアントとの通信のために Socket を作成し、引き続き ServerSocket 上でほかの要求を待機します。クライアントもサーバとの通信のために Socket を作成します。以下の図にその流れを示します。

詳細な説明を参照してください[D]

接続の確立後に、ソケット間の通信で、getInputStream()getOutputSteam() が使用される場合があります。

UDP を使用したデータグラムパケットの送受信

以下は、UDP を使用したデータグラムパケットの送受信に関係するクラスです。

DatagramPacket は、データグラムパケットを表します。データグラムパケットは、無接続配信で使用され、通常は宛先のアドレスとポートに関する情報が含まれています。DatagramSocket は、ネットワーク上で UDP を使用してデータグラムパケットを送受信するために使用されるソケットを表します。DatagramPacket は、send(DatagramPacket dp)引数のように、DatagramSocketsend(...) メソッドを呼び出し、DatagramPacket を渡すことによって、DatagramSocket から送信されます。DatagramPacket を受信するには、receive(DatagramPacket dp) を使用します。MulticastSocket クラスを使用すると、マルチキャストグループに対する DatagramPacket の送受信を行うことができます。このクラスは、マルチキャスティング機能を追加するための DatagramSocket のサブクラスです。

詳細な説明を参照してください[D]

ネットワークリソースの検索と識別

以下のクラスは、ネットワークリソースの検索と識別に関係するクラスです。

もっとも一般的に使用されるクラスは、URIURLURLConnection、および HttpURLConnection です。

URI は、リソース用の URI (Uniform Resource Identifier) を表します。URI は、リソースの識別子ですが、そのリソースのロケータになる必要はありません。URL は、リソース用の URL (Uniform Resource Locator) を表します。URL は URI のサブセットですが、URL クラスは、URI クラスのサブクラスではありません。つまり、URL はリソースへのアクセス方法を示し、URI はアクセス方法を示す場合と示さない場合があります。Uniform Resource Name (URN) も URI のサブセットです。ただし、URN を表す Java クラスはありません。

URI のサブクラスとしての URL と URN を示す図

URLConnection は、アプリケーションと、URL によって識別されるネットワークリソースとの間の接続を表す抽象スーパークラスです。URL が指定され、それによりプロトコルが指定されると、URL.openConnection() は、そのプロトコルの URLConnection の適切な実装を返します。プロトコルは、URL から認識することができます。このインスタンスは、実際に接続を開き URL にアクセスする URLConnection.connect() を提供します。

詳細な説明を参照してください[D]

HttpURLConnection は、もっとも一般的に使用される URLConnection の実装です。これは、Web サーバのコンテンツにアクセスするために使用される http プロトコル用の実装です。上の図では、URL のアクセスプロトコルが http の場合、openConnection() メソッドによって HttpURLConnection のインスタンスが返されます。

セキュリティ

セキュリティに関しては、認証とアクセス権に関係するクラスを使用します。認証は、ユーザの認証に関係し、ユーザ名とパスワードのチェックを含みます。ユーザが URL にアクセスしようとした場合など、多くの場合、ユーザの認証が必要になります。アクセス権は、実行可能な処理に関係します。たとえば、NetPermission オブジェクト setDefaultAuthenticator が存在しない場合に、Authenticator.setDefault(Authenticator a) を呼び出だすと、セキュリティ例外が発生します。

認証

プロキシや元のサーバの一部では、BASIC や DIGEST などの認証スキームを使用した認証情報が必要です。たとえばプロキシ経由で http による接続をし、プロキシでは認証が必要な場合は、Authenticator クラスを呼び出してユーザ名、パスワード、および認証に必要なその他の項目を取得します。認証に関連するクラスは次のとおりです。

ユーザ認証だけでなく、abstract クラスである Authenticator には、要求されている認証についてクエリするメソッドもあります (getRequestingXXX() 参照)。通常このクラスは、サブクラス化され、setDefault(Authenticator a) を呼び出すことによってサブクラスのインスタンスがシステムに登録されます。セキュリティマネージャが存在する場合は、セキュリティマネージャが、セキュリティポリシーによって NetPermissionsetDefaultAthenticator」 が許可されるかどうかをチェックします。システムが認証を必要とする場合、システムは、requestPasswordAuthentication() などのメソッドを呼び出します。

PasswordAuthentication は、単純にユーザ名とパスワードを格納するデータホルダーです。

アクセス権

SocketPermission は、接続受け入れ待機解決などのそのホスト上で実行できる一連の処理と、ホストおよびオプションのポート範囲で構成されます。このクラスは、1 つの SocketPermission が、別の Permission と等しいかどうか、あるいは別の Permission を意味するかどうかを判断するためのメソッドを含んでいます。SocketPermissionPermissionCollection に含めると、アクセス権の有無を簡単にチェックできるようになります。

NetPermission は、さまざまな名前付きネットワークアクセス権を表すためのクラスです。現在、上記の setDefaultAuthenticatorrequestPasswordAuthentication、および specifyStreamHandler の 3 つのネットワークアクセス権があります。NetPermissionPermissionCollection に含めると、アクセス権の有無を簡単にチェックできるようになります。

アクセス権の詳細については、http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/security/permissions.html を参照してください。