|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
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
メソッドのうち 1 つを呼び出すことによって作成できます。新しく作成されたソケットチャネルはオープンですが、接続は確立されていません。未接続のチャネルに対して入力操作を呼び出そうとすると、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 |
コンストラクタの詳細 |
---|
protected SocketChannel(SelectorProvider provider)
メソッドの詳細 |
---|
public static SocketChannel open() throws IOException
新しいチャネルを作成するには、システム全体のデフォルトである SelectorProvider
オブジェクトの openSocketChannel
メソッドを呼び出します。
IOException
- 入出力エラーが発生した場合public static SocketChannel open(SocketAddress remote) throws IOException
この簡易メソッドは、open()
メソッドの呼び出しと同じように機能します。具体的には、結果として得られるソケットチャネルに対して connect
メソッドを呼び出し、これを remote に渡して、そのチャネルを返します。
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, dsts.length);
ScatteringByteChannel
内の read
dsts
- バイトの転送先バッファー
NotYetConnectedException
- このチャネルがまだ接続されていない場合
ClosedChannelException
- このチャネルがクローズしている場合
AsynchronousCloseException
- 読み込み操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合
ClosedByInterruptException
- 読み込み操作の進行中に、別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込み状態が設定された場合
IOException
- その他の入出力エラーが発生した場合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
- その他の入出力エラーが発生した場合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
- その他の入出力エラーが発生した場合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 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。