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) を呼び出すことによってサブクラスのインスタンスがシステムに登録されます。セキュリティーマネージャーが存在する場合は、セキュリティーマネージャーが、セキュリティーポリシーによって NetPermission "setDefaultAthenticator" が許可されるかどうかをチェックします。システムが認証を必要とする場合、システムは、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 を参照してください。