JavaTM 2 Platform
Standard Ed. 5.0

java.nio.channels
クラス SocketChannel

java.lang.Object
  上位を拡張 java.nio.channels.spi.AbstractInterruptibleChannel
      上位を拡張 java.nio.channels.SelectableChannel
          上位を拡張 java.nio.channels.spi.AbstractSelectableChannel
              上位を拡張 java.nio.channels.SocketChannel
すべての実装されたインタフェース:
Closeable, ByteChannel, Channel, GatheringByteChannel, InterruptibleChannel, ReadableByteChannel, ScatteringByteChannel, WritableByteChannel

public abstract class SocketChannel
extends AbstractSelectableChannel
implements ByteChannel, ScatteringByteChannel, GatheringByteChannel

ストリーム型接続ソケット用の選択可能チャネルです。

ソケットチャネルは、ネットワークソケット接続の完全な抽象化ではありません。ソケットオプションのバインド、停止、操作は、socket メソッドの呼び出しによって取得した関連 Socket オブジェクトを介して行う必要があります。任意の既存ソケットのチャネルを作成したり、ソケットチャネルに関連したソケットで SocketImpl オブジェクトを使用するように指定したりすることはできません。

ソケットチャネルは、このクラスの open メソッドを呼び出すと作成されます。新しく作成されたソケットチャネルはオープンですが、未接続です。未接続のソケットチャネルに対して入出力操作を呼び出そうとすると、NotYetConnectedException がスローされます。ソケットチャネルを接続するには、ソケットチャネルの connect メソッドを呼び出します。接続されたソケットチャネルは、クローズするまで接続されたままになります。ソケットチャネルが接続されているかどうかは、isConnected メソッドの呼び出しによって判断できます。

ソケットチャネルは「非ブロック接続」をサポートします。ソケットチャネルの作成とリモートソケットへのリンクの確立プロセスは connect メソッドによって開始され、あとで finishConnect メソッドによって完了します。接続操作が実行中であるかどうかは、isConnectionPending メソッドの呼び出しによって判断できます。

ソケットチャネルの入力側と出力側は、実際にチャネルをクローズすることなく、別々に「停止」できます。関連ソケットオブジェクトの shutdownInput メソッドを呼び出してチャネルの入力側を停止したあと、さらにチャネルを読み取ろうとすると、ストリームの終わりを示す -1 が返されます。関連ソケットオブジェクトの shutdownOutput メソッドを呼び出してチャネルの出力側を停止したあと、さらにチャネルへ書き込もうとすると、ClosedChannelException がスローされます。

ソケットチャネルは、Channel クラスに指定されている非同期クローズ操作とよく似た「非同期停止」をサポートします。ソケットのチャネルに対する読み込み操作の途中でブロックされたスレッドがあるときに、別のスレッドがソケットの入力側を停止した場合、ブロックされたスレッドの読み込み操作は、バイトを一切読み取ることなく終了し、-1 を返します。ソケットのチャネルに対する書き込み操作の途中でブロックされたスレッドがあるときに、別のスレッドがソケットの出力側を停止した場合、ブロックされたスレッドは AsynchronousCloseException を受け取ります。

ソケットチャネルは複数の並行スレッドで安全に使用できます。ソケットチャネルは並行読み込みおよび並行書き込みをサポートします。ただし、読み込みを行うスレッドと書き込みを行うスレッドは常に 1 個以下です。connect メソッドと finishConnect メソッドは相互に同期しており、どちらか一方のメソッドの処理が進行中に読み込みまたは書き込み操作を開始しようとすると、その処理はメソッドの呼び出し処理が完了するまでブロックされます。

導入されたバージョン:
1.4

コンストラクタの概要
protected SocketChannel(SelectorProvider provider)
          このクラスの新しいインスタンスを初期化します。
 
メソッドの概要
abstract  boolean connect(SocketAddress remote)
          このチャネルのソケットを接続します。
abstract  boolean finishConnect()
          ソケットチャネルの接続処理を完了します。
abstract  boolean isConnected()
          このチャネルのネットワークソケットが接続されているかどうかを判断します。
abstract  boolean isConnectionPending()
          このチャネル上で接続操作が進行中かどうかを判断します。
static SocketChannel open()
          ソケットチャネルをオープンします。
static SocketChannel open(SocketAddress remote)
          ソケットチャネルをオープンし、リモートアドレスに接続します。
abstract  int read(ByteBuffer dst)
          このチャネルのバイトシーケンスを指定のバッファに読み込みます。
 long read(ByteBuffer[] dsts)
          このチャネルのバイトシーケンスを指定されたバッファに読み込みます。
abstract  long read(ByteBuffer[] dsts, int offset, int length)
          このチャネルのバイトシーケンスを指定されたバッファのサブシーケンスに読み込みます。
abstract  Socket socket()
          このチャネルに関連したソケットを取得します。
 int validOps()
          このチャネルのサポートされている操作を識別する操作セットを返します。
abstract  int write(ByteBuffer src)
          このチャネルのバイトシーケンスを指定のバッファから書き出します。
 long write(ByteBuffer[] srcs)
          このチャネルのバイトシーケンスを指定されたバッファから書き出します。
abstract  long write(ByteBuffer[] srcs, int offset, int length)
          このチャネルのバイトシーケンスを指定されたバッファのサブシーケンスから書き出します。
 
クラス java.nio.channels.spi.AbstractSelectableChannel から継承されたメソッド
blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register
 
クラス java.nio.channels.SelectableChannel から継承されたメソッド
register
 
クラス java.nio.channels.spi.AbstractInterruptibleChannel から継承されたメソッド
begin, close, end, isOpen
 
クラス java.lang.Object から継承されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
インタフェース java.nio.channels.Channel から継承されたメソッド
close, isOpen
 
インタフェース java.nio.channels.Channel から継承されたメソッド
close, isOpen
 
インタフェース java.nio.channels.Channel から継承されたメソッド
close, isOpen
 
インタフェース java.nio.channels.Channel から継承されたメソッド
close, isOpen
 

コンストラクタの詳細

SocketChannel

protected SocketChannel(SelectorProvider provider)
このクラスの新しいインスタンスを初期化します。

メソッドの詳細

open

public static SocketChannel open()
                          throws IOException
ソケットチャネルをオープンします。

新しいチャネルは、システム全体のデフォルトである SelectorProvider オブジェクトの openSocketChannel メソッドを呼び出すと作成されます。

戻り値:
新しいソケットチャネル
例外:
IOException - 入出力エラーが発生した場合

open

public static SocketChannel open(SocketAddress remote)
                          throws IOException
ソケットチャネルをオープンし、リモートアドレスに接続します。

この簡易メソッドは、open() メソッドを呼び出し、作成されたソケットチャネルに対して remote を指定した connect メソッドを呼び出した場合と同じように機能します。戻り値は、作成されたチャネルです。

パラメータ:
remote - 新しいチャネルの接続先リモートアドレス
例外:
AsynchronousCloseException - 接続操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException - 接続操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込み状態が設定された場合
UnresolvedAddressException - 指定されたリモートアドレスが完全に解決されない場合
UnsupportedAddressTypeException - 指定されたリモートアドレスのタイプがサポート対象外の場合
SecurityException - セキュリティマネージャがインストールされていて、指定されたリモートエンドポイントへのアクセスが許可されていない場合
IOException - その他の入出力エラーが発生した場合

validOps

public final int validOps()
このチャネルのサポートされている操作を識別する操作セットを返します。

ソケットチャネルは接続、読み込み、書き込みをサポートするので、このメソッドは (SelectionKey.OP_CONNECT | SelectionKey.OP_READ | SelectionKey.OP_WRITE) を返します。

定義:
クラス SelectableChannel 内の validOps
戻り値:
有効な操作セット

socket

public abstract Socket socket()
このチャネルに関連したソケットを取得します。

返されるオブジェクトは、Socket クラスで宣言されていない public メソッドは宣言しません。

戻り値:
このチャネルに関連したソケット

isConnected

public abstract boolean isConnected()
このチャネルのネットワークソケットが接続されているかどうかを判断します。

戻り値:
このチャネルのネットワークソケットが接続されている場合に限り true

isConnectionPending

public abstract boolean isConnectionPending()
このチャネル上で接続操作が進行中かどうかを判断します。

戻り値:
このチャネル上で接続操作が開始されたが、まだ完了していない (finishConnect メソッドが呼び出されていない) 場合に限り true

connect

public abstract boolean connect(SocketAddress remote)
                         throws IOException
このチャネルのソケットを接続します。

このチャネルが非ブロックモードの場合、このメソッドの呼び出しにより、非ブロック接続操作が開始されます。ローカル接続の場合のように即座に接続が確立される場合、このメソッドは true を返します。それ以外の場合は false を返します。この場合は、あとで finishConnect メソッドを呼び出すことにより、接続操作を完了する必要があります。

このチャネルがブロックモードの場合、このメソッドの呼び出しは、接続が確立されるか入出力エラーが発生するまでブロックされます。

このメソッドは Socket クラスとまったく同じセキュリティチェックを行います。セキュリティマネージャがインストールされている場合、このメソッドは、指定されたリモートエンドポイントのアドレスおよびポート番号への接続をセキュリティマネージャの checkConnect メソッドが許可することを確認します。

このメソッドはいつでも呼び出すことができます。このメソッドの呼び出し処理の進行中にこのチャネルに対する読み込みまたは書き込み操作を呼び出した場合、呼び出し処理が完了するまでその操作はブロックされます。接続しようとしたが失敗した場合、すなわちこのメソッドの呼び出しがチェックされる例外をスローした場合、チャネルはクローズされます。

パラメータ:
remote - このチャネルの接続先リモートアドレス
戻り値:
接続が確立された場合は true、このチャネルが非ブロックモードで、接続操作の実行中である場合は false
例外:
AlreadyConnectedException - このチャネルがすでに接続されている場合
ConnectionPendingException - このチャネルですでに非ブロック接続操作が実行中である場合
ClosedChannelException - このチャネルがクローズしている場合
AsynchronousCloseException - 接続操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException - 接続操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込み状態が設定された場合
UnresolvedAddressException - 指定されたリモートアドレスが完全に解決されない場合
UnsupportedAddressTypeException - 指定されたリモートアドレスのタイプがサポート対象外の場合
SecurityException - セキュリティマネージャがインストールされていて、指定されたリモートエンドポイントへのアクセスが許可されていない場合
IOException - その他の入出力エラーが発生した場合

finishConnect

public abstract boolean finishConnect()
                               throws IOException
ソケットチャネルの接続処理を完了します。

ソケットチャネルを非ブロックモードにしてから connect メソッドを呼び出すと、非ブロック接続操作が開始されます。接続が確立されるか、接続に失敗したあと、ソケットチャネルは接続可能な状態になり、このメソッドを呼び出して接続シーケンスを完了することができます。接続操作に失敗した場合にこのメソッドを呼び出すと、該当する IOException がスローされます。

このチャネルがすでに接続されている場合、このメソッドはブロックされ、ただちに true を返します。このチャネルが非ブロックモードの場合、接続処理がまだ完了していなければ、このメソッドは false を返します。このチャネルがブロックモードの場合、接続が完了するか失敗するまでこのメソッドはブロックされます。なお、接続が完了した場合は true が返され、接続に失敗した場合はチェックされる例外がスローされます。

このメソッドはいつでも呼び出すことができます。このメソッドの呼び出し処理の進行中にこのチャネルに対する読み込みまたは書き込み操作を呼び出した場合、呼び出し処理が完了するまでその操作はブロックされます。接続が失敗した場合、すなわちこのメソッドの呼び出しがチェックされる例外をスローした場合、チャネルはクローズされます。

戻り値:
このチャネルのソケットが接続されている場合に限り true
例外:
NoConnectionPendingException - このチャネルが接続されておらず、接続操作も開始されていない場合
ClosedChannelException - このチャネルがクローズしている場合
AsynchronousCloseException - 接続操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException - 接続操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込み状態が設定された場合
IOException - その他の入出力エラーが発生した場合

read

public abstract int read(ByteBuffer dst)
                  throws IOException
インタフェース ReadableByteChannel の記述:
このチャネルのバイトシーケンスを指定のバッファに読み込みます。

チャネルから最大 r バイトを読み取ろうとします。r は、このメソッドを呼び出すときにバッファ内に存在するバイト数、dst.remaining() になります。

長さ n (0 <= n <= r) のバイトシーケンスが読み取られるとします。このバイトシーケンスがバッファに転送されるため、シーケンス内の最初のバイトのインデックスは p、最後のバイトのインデックスは p + n - 1 になります。なお、p は、このメソッドを呼び出すときのバッファの位置です。バッファの位置は、返されるとき p + n に等しくなります。リミットに変化はありません。

読み込み操作によってバッファがいっぱいになるとはかぎりません。バイトが一切読み取られない場合もあります。バッファがいっぱいになるかどうかは、チャネルの本来の性質と状態によって決定します。たとえば非ブロックモードのソケットは、ソケットの入力バッファからただちに取得できるバイト以外を読み取ることができません。同様に、ファイルチャネルは、ファイル内のバイト以外を読み取ることができません。ただし、チャネルがブロックモードであり、バッファ内のバイト数が 1 バイト以上の場合、1 バイト以上が読み取られるまでこのメソッドはブロックされることになっています。

このメソッドはいつでも呼び出せます。ただし、ほかのスレッドがこのチャネルに対して読み込み操作を開始している場合、このメソッドの呼び出しは最初の操作が終わるまでブロックされます。

定義:
インタフェース ReadableByteChannel 内の read
パラメータ:
dst - バイトの転送先バッファ
戻り値:
読み込まれた文字数。ゼロか、チャネルがストリームの終わりに達している場合は -1
例外:
NotYetConnectedException - このチャネルがまだ接続されていない場合
ClosedChannelException - このチャネルがクローズしている場合
AsynchronousCloseException - 読み込み操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException - 読み込み操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込み状態が設定された場合
IOException - その他の入出力エラーが発生した場合

read

public abstract long read(ByteBuffer[] dsts,
                          int offset,
                          int length)
                   throws IOException
インタフェース ScatteringByteChannel の記述:
このチャネルのバイトシーケンスを指定されたバッファのサブシーケンスに読み込みます。

このメソッド呼び出しは、このチャネルから最大 r バイトを読み取ろうとします。r は、このメソッドの呼び出し時に指定されたバッファ配列の指定されたサブシーケンスに含まれる合計バイト数です。

 dsts[offset].remaining() + dsts[offset+1].remaining() + ... + dsts[offset+length-1].remaining()

長さ n (0 <= n <= r) のバイトシーケンスが読み取られるとします。このシーケンスの最初の dsts[offset].remaining() バイトまでがバッファ dsts[offset] に転送され、次の dsts[offset+1].remaining() バイトまでがバッファ dsts[offset+1] に転送されます。この処理は、すべてのバイトシーケンスが指定されたバッファに転送されるまで繰り返されます。各バッファには最大限のバイトが転送されるため、最終更新バッファを除く個々の更新バッファの最終的な位置は、このバッファのリミットと等しくなります。

このメソッドはいつでも呼び出せます。ただし、ほかのスレッドがこのチャネルに対して読み込み操作を開始している場合、このメソッドの呼び出しは最初の操作が終わるまでブロックされます。

定義:
インタフェース ScatteringByteChannel 内の read
パラメータ:
dsts - バイトの転送先バッファ
offset - 最初のバイトの転送先となるバッファ配列内のオフセット。dsts.length 以下のゼロまたは正の数
length - アクセス可能な最大バッファ数。dsts.length - offset 以下のゼロまたは正の数
戻り値:
読み込まれた文字数。ゼロか、チャネルがストリームの終わりに達している場合は -1
例外:
NotYetConnectedException - このチャネルがまだ接続されていない場合
ClosedChannelException - このチャネルがクローズしている場合
AsynchronousCloseException - 読み込み操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException - 読み込み操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込み状態が設定された場合
IOException - その他の入出力エラーが発生した場合

read

public final long read(ByteBuffer[] dsts)
                throws IOException
インタフェース ScatteringByteChannel の記述:
このチャネルのバイトシーケンスを指定されたバッファに読み込みます。

このメソッドを c.read(dsts) の形式で呼び出した場合、次の呼び出しと同じ結果が得られます。

 c.read(dsts, 0, srcs.length);

定義:
インタフェース ScatteringByteChannel 内の read
パラメータ:
dsts - バイトの転送先バッファ
戻り値:
読み込まれた文字数。ゼロか、チャネルがストリームの終わりに達している場合は -1
例外:
NotYetConnectedException - このチャネルがまだ接続されていない場合
ClosedChannelException - このチャネルがクローズしている場合
AsynchronousCloseException - 読み込み操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException - 読み込み操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込み状態が設定された場合
IOException - その他の入出力エラーが発生した場合

write

public abstract int write(ByteBuffer src)
                   throws IOException
インタフェース WritableByteChannel の記述:
このチャネルのバイトシーケンスを指定のバッファから書き出します。

チャネルへ最大 r バイトを書き込もうとします。r は、このメソッドを呼び出すときにバッファ内に存在するバイト数、dst.remaining() になります。

長さ n (0 <= n <= r) のバイトシーケンスが書き込まれるとします。このバイトシーケンスはバッファのインデックス p から転送されます。p は、このメソッドを呼び出した時点のバッファの位置です。書き込まれる最後のバイトは p + n - 1 になります。バッファの位置は、終了時に p + n に等しくなります。リミットに変化はありません。

特に指定がないかぎり、要求された r バイトがすべて書き込まれると書き込み操作は終了します。チャネルの種類によっては、その状態に応じて、一部のバイトしか書き込まれない場合や、まったく書き込みが行われない場合もあります。たとえば非ブロックモードのソケットチャネルでは、ソケットの出力バッファ内のバイト数が最大書き込みバイト数になります。

このメソッドはいつでも呼び出せます。ただし、ほかのスレッドがこのチャネルに対して書き込み操作を開始している場合、このメソッドの呼び出しは最初の操作が終わるまでブロックされます。

定義:
インタフェース WritableByteChannel 内の write
パラメータ:
src - バイトの取得先バッファ
戻り値:
書き込まれるバイト数。ゼロの場合もある
例外:
NotYetConnectedException - このチャネルがまだ接続されていない場合
ClosedChannelException - このチャネルがクローズしている場合
AsynchronousCloseException - 書き込み中に別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException - 書き込み中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込み状態が設定された場合
IOException - その他の入出力エラーが発生した場合

write

public abstract long write(ByteBuffer[] srcs,
                           int offset,
                           int length)
                    throws IOException
インタフェース GatheringByteChannel の記述:
このチャネルのバイトシーケンスを指定されたバッファのサブシーケンスから書き出します。

このチャネルに最大 r バイトを書き込もうとします。r は、このメソッドの呼び出し時に指定されたバッファ配列の指定されたサブシーケンスに含まれる合計バイト数です。

 srcs[offset].remaining() + srcs[offset+1].remaining() + ... + srcs[offset+length-1].remaining()

長さ n (0 <= n <= r) のバイトシーケンスが書き込まれるとします。このシーケンスの最初の srcs[offset].remaining()バイトまでがバッファ srcs[offset] に書き込まれ、次の srcs[offset+1].remaining() バイトがバッファ srcs[offset] からバッファ srcs[offset+1] に書き込まれます。この処理は、バイトシーケンス全部が書き込まれるまで繰り返されます。各バッファから最大限のバイトが書き込まれるため、更新された個々のバッファの最終的な位置は、最終更新バッファを除いて、このバッファのリミットと等しくなります。

特に指定がないかぎり、要求された r バイトがすべて書き込まれると書き込み操作は終了します。チャネルの種類によっては、その状態に応じて、一部のバイトしか書き込まれない場合や、まったく書き込みが行われない場合もあります。たとえば非ブロックモードのソケットチャネルでは、ソケットの出力バッファ内のバイト数が最大書き込みバイト数になります。

このメソッドはいつでも呼び出せます。ただし、ほかのスレッドがこのチャネルに対して書き込み操作を開始している場合、このメソッドの呼び出しは最初の操作が終わるまでブロックされます。

定義:
インタフェース GatheringByteChannel 内の write
パラメータ:
srcs - バイトの取得先バッファ
offset - 最初のバイトの取得先となるバッファ配列内のオフセット。srcs.length 以下のゼロまたは正の数
length - アクセス可能な最大バッファ数。srcs.length - offset 以下のゼロまたは正の数
戻り値:
書き込まれるバイト数。ゼロの場合もある
例外:
NotYetConnectedException - このチャネルがまだ接続されていない場合
ClosedChannelException - このチャネルがクローズしている場合
AsynchronousCloseException - 書き込み中に別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException - 書き込み中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込み状態が設定された場合
IOException - その他の入出力エラーが発生した場合

write

public final long write(ByteBuffer[] srcs)
                 throws IOException
インタフェース GatheringByteChannel の記述:
このチャネルのバイトシーケンスを指定されたバッファから書き出します。

このメソッドを c.write(srcs) の形式で呼び出した場合、次の呼び出しと同じ結果が得られます。

 c.write(srcs, 0, srcs.length);

定義:
インタフェース GatheringByteChannel 内の write
パラメータ:
srcs - バイトの取得先バッファ
戻り値:
書き込まれるバイト数。ゼロの場合もある
例外:
NotYetConnectedException - このチャネルがまだ接続されていない場合
ClosedChannelException - このチャネルがクローズしている場合
AsynchronousCloseException - 書き込み中に別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException - 書き込み中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込み状態が設定された場合
IOException - その他の入出力エラーが発生した場合

JavaTM 2 Platform
Standard Ed. 5.0

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java 2 SDK SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。