|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object java.nio.channels.spi.AbstractInterruptibleChannel java.nio.channels.SelectableChannel java.nio.channels.spi.AbstractSelectableChannel java.nio.channels.SocketChannel
public abstract class SocketChannel
ストリーム型接続ソケット用の選択可能チャネルです。
ソケットチャネルは、ネットワークソケット接続の完全な抽象化ではありません。ソケットオプションのバインド、停止、操作は、socket
メソッドの呼び出しによって取得した関連 Socket
オブジェクトを介して行う必要があります。任意の既存ソケットのチャネルを作成したり、ソケットチャネルに関連したソケットで SocketImpl
オブジェクトを使用するように指定したりすることはできません。
ソケットチャネルは、このクラスの open
メソッドを呼び出すと作成されます。新しく作成されたソケットチャネルはオープンですが、未接続です。未接続のソケットチャネルに対して入出力操作を呼び出そうとすると、NotYetConnectedException
がスローされます。ソケットチャネルを接続するには、ソケットチャネルの connect
メソッドを呼び出します。接続されたソケットチャネルは、クローズするまで接続されたままになります。ソケットチャネルが接続されているかどうかは、isConnected
メソッドの呼び出しによって判断できます。
ソケットチャネルは「非ブロック接続」をサポートします。ソケットチャネルの作成とリモートソケットへのリンクの確立プロセスは connect
メソッドによって開始され、あとで finishConnect
メソッドによって完了します。接続操作が実行中であるかどうかは、isConnectionPending
メソッドの呼び出しによって判断できます。
ソケットチャネルの入力側と出力側は、実際にチャネルをクローズすることなく、別々に「停止」できます。関連ソケットオブジェクトの shutdownInput
メソッドを呼び出してチャネルの入力側を停止したあと、さらにチャネルを読み取ろうとすると、ストリームの終わりを示す -1 が返されます。関連ソケットオブジェクトの shutdownOutput
メソッドを呼び出してチャネルの出力側を停止したあと、さらにチャネルへ書き込もうとすると、ClosedChannelException
がスローされます。
ソケットチャネルは、Channel
クラスに指定されている非同期クローズ操作とよく似た「非同期停止」をサポートします。ソケットのチャネルに対する読み込み操作の途中でブロックされたスレッドがあるときに、別のスレッドがソケットの入力側を停止した場合、ブロックされたスレッドの読み込み操作は、バイトを一切読み取ることなく終了し、-1 を返します。ソケットのチャネルに対する書き込み操作の途中でブロックされたスレッドがあるときに、別のスレッドがソケットの出力側を停止した場合、ブロックされたスレッドは AsynchronousCloseException
を受け取ります。
ソケットチャネルは複数の並行スレッドで安全に使用できます。ソケットチャネルは並行読み込みおよび並行書き込みをサポートします。ただし、読み込みを行うスレッドと書き込みを行うスレッドは常に 1 個以下です。connect
メソッドと finishConnect
メソッドは相互に同期しており、どちらか一方のメソッドの処理が進行中に読み込みまたは書き込み操作を開始しようとすると、その処理はメソッドの呼び出し処理が完了するまでブロックされます。
コンストラクタの概要 | |
---|---|
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 |
コンストラクタの詳細 |
---|
protected SocketChannel(SelectorProvider provider)
メソッドの詳細 |
---|
public static SocketChannel open() throws IOException
新しいチャネルは、システム全体のデフォルトである SelectorProvider
オブジェクトの openSocketChannel
メソッドを呼び出すと作成されます。
IOException
- 入出力エラーが発生した場合public static SocketChannel open(SocketAddress remote) throws IOException
この簡易メソッドは、open()
メソッドを呼び出し、作成されたソケットチャネルに対して remote を指定した connect
メソッドを呼び出した場合と同じように機能します。戻り値は、作成されたチャネルです。
remote
- 新しいチャネルの接続先リモートアドレス
AsynchronousCloseException
- 接続操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException
- 接続操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込み状態が設定された場合
UnresolvedAddressException
- 指定されたリモートアドレスが完全に解決されない場合
UnsupportedAddressTypeException
- 指定されたリモートアドレスのタイプがサポート対象外の場合
SecurityException
- セキュリティマネージャがインストールされていて、指定されたリモートエンドポイントへのアクセスが許可されていない場合
IOException
- その他の入出力エラーが発生した場合public final int validOps()
ソケットチャネルは接続、読み込み、書き込みをサポートするので、このメソッドは (SelectionKey.OP_CONNECT
| SelectionKey.OP_READ
| SelectionKey.OP_WRITE
) を返します。
SelectableChannel
内の validOps
public abstract Socket socket()
返されるオブジェクトは、Socket
クラスで宣言されていない public メソッドは宣言しません。
public abstract boolean isConnected()
public abstract boolean isConnectionPending()
finishConnect
メソッドが呼び出されていない) 場合に限り truepublic abstract boolean connect(SocketAddress remote) throws IOException
このチャネルが非ブロックモードの場合、このメソッドの呼び出しにより、非ブロック接続操作が開始されます。ローカル接続の場合のように即座に接続が確立される場合、このメソッドは true を返します。それ以外の場合は false を返します。この場合は、あとで finishConnect
メソッドを呼び出すことにより、接続操作を完了する必要があります。
このチャネルがブロックモードの場合、このメソッドの呼び出しは、接続が確立されるか入出力エラーが発生するまでブロックされます。
このメソッドは Socket
クラスとまったく同じセキュリティチェックを行います。セキュリティマネージャがインストールされている場合、このメソッドは、指定されたリモートエンドポイントのアドレスおよびポート番号への接続をセキュリティマネージャの checkConnect
メソッドが許可することを確認します。
このメソッドはいつでも呼び出すことができます。このメソッドの呼び出し処理の進行中にこのチャネルに対する読み込みまたは書き込み操作を呼び出した場合、呼び出し処理が完了するまでその操作はブロックされます。接続しようとしたが失敗した場合、すなわちこのメソッドの呼び出しがチェックされる例外をスローした場合、チャネルはクローズされます。
remote
- このチャネルの接続先リモートアドレス
AlreadyConnectedException
- このチャネルがすでに接続されている場合
ConnectionPendingException
- このチャネルですでに非ブロック接続操作が実行中である場合
ClosedChannelException
- このチャネルがクローズしている場合
AsynchronousCloseException
- 接続操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException
- 接続操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込み状態が設定された場合
UnresolvedAddressException
- 指定されたリモートアドレスが完全に解決されない場合
UnsupportedAddressTypeException
- 指定されたリモートアドレスのタイプがサポート対象外の場合
SecurityException
- セキュリティマネージャがインストールされていて、指定されたリモートエンドポイントへのアクセスが許可されていない場合
IOException
- その他の入出力エラーが発生した場合public abstract boolean finishConnect() throws IOException
ソケットチャネルを非ブロックモードにしてから connect
メソッドを呼び出すと、非ブロック接続操作が開始されます。接続が確立されるか、接続に失敗したあと、ソケットチャネルは接続可能な状態になり、このメソッドを呼び出して接続シーケンスを完了することができます。接続操作に失敗した場合にこのメソッドを呼び出すと、該当する IOException
がスローされます。
このチャネルがすでに接続されている場合、このメソッドはブロックされ、ただちに true を返します。このチャネルが非ブロックモードの場合、接続処理がまだ完了していなければ、このメソッドは false を返します。このチャネルがブロックモードの場合、接続が完了するか失敗するまでこのメソッドはブロックされます。なお、接続が完了した場合は true が返され、接続に失敗した場合はチェックされる例外がスローされます。
このメソッドはいつでも呼び出すことができます。このメソッドの呼び出し処理の進行中にこのチャネルに対する読み込みまたは書き込み操作を呼び出した場合、呼び出し処理が完了するまでその操作はブロックされます。接続が失敗した場合、すなわちこのメソッドの呼び出しがチェックされる例外をスローした場合、チャネルはクローズされます。
NoConnectionPendingException
- このチャネルが接続されておらず、接続操作も開始されていない場合
ClosedChannelException
- このチャネルがクローズしている場合
AsynchronousCloseException
- 接続操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException
- 接続操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込み状態が設定された場合
IOException
- その他の入出力エラーが発生した場合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
- バイトの転送先バッファ
NotYetConnectedException
- このチャネルがまだ接続されていない場合
ClosedChannelException
- このチャネルがクローズしている場合
AsynchronousCloseException
- 読み込み操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException
- 読み込み操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込み状態が設定された場合
IOException
- その他の入出力エラーが発生した場合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 以下のゼロまたは正の数
NotYetConnectedException
- このチャネルがまだ接続されていない場合
ClosedChannelException
- このチャネルがクローズしている場合
AsynchronousCloseException
- 読み込み操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException
- 読み込み操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込み状態が設定された場合
IOException
- その他の入出力エラーが発生した場合public final long read(ByteBuffer[] dsts) throws IOException
ScatteringByteChannel
の記述: このメソッドを c.read(dsts) の形式で呼び出した場合、次の呼び出しと同じ結果が得られます。
c.read(dsts, 0, srcs.length);
ScatteringByteChannel
内の read
dsts
- バイトの転送先バッファ
NotYetConnectedException
- このチャネルがまだ接続されていない場合
ClosedChannelException
- このチャネルがクローズしている場合
AsynchronousCloseException
- 読み込み操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException
- 読み込み操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込み状態が設定された場合
IOException
- その他の入出力エラーが発生した場合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
- その他の入出力エラーが発生した場合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
- その他の入出力エラーが発生した場合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 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。