JavaTM Platform
Standard Ed. 6

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 メソッドのうち 1 つを呼び出すことによって作成できます。新しく作成されたソケットチャネルはオープンですが、接続は確立されていません。未接続のチャネルに対して入力操作を呼び出そうとすると、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
 

コンストラクタの詳細

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() メソッドの呼び出しと同じように機能します。具体的には、結果として得られるソケットチャネルに対して connect メソッドを呼び出し、これを remote に渡して、そのチャネルを返します。

パラメータ:
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, dsts.length);

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

write

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

チャネルへ最大 r バイトを書き込もうとします。r は、このメソッドを呼び出すときにバッファー内に存在するバイト数、src.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+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 Platform
Standard Ed. 6

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

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