JavaTM 2
Platform
Std. Ed. v1.4.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
すべての実装インタフェース:
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
 

コンストラクタの詳細

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 クラスで宣言されていない公開メソッドは宣言しません。

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

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 - このチャネルがまだ接続されていない場合
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 - このチャネルがまだ接続されていない場合
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 - このチャネルがまだ接続されていない場合
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 - このチャネルがまだ接続されていない場合
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 - このチャネルがまだ接続されていない場合
IOException - その他の入出力エラーが発生した場合

write

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

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

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

定義:
インタフェース GatheringByteChannel 内の write
パラメータ:
srcs - バイトの取得先バッファ
戻り値:
書き込まれるバイト数。ゼロの場合もある
例外:
NotYetConnectedException - このチャネルがまだ接続されていない場合
IOException - その他の入出力エラーが発生した場合

JavaTM 2
Platform
Std. Ed. v1.4.0

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

Java、Java 2D、および JDBC は米国ならびにその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2002 Sun Microsystems, Inc. 901 San Antonio Road
Palo Alto, California, 94303, U.S.A. All Rights Reserved.