public abstract class SocketChannel extends AbstractSelectableChannel implements ByteChannel, ScatteringByteChannel, GatheringByteChannel, NetworkChannel
ソケット・チャネルは、このクラスのopen
メソッドの1つを呼び出すことによって作成されます。任意の既存のソケット用にチャネルを作成することはできません。新しく作成されたソケット・チャネルはオープンですが、接続は確立されていません。未接続のチャネルに対して入力操作を呼び出そうとすると、NotYetConnectedException
がスローされます。ソケット・チャネルを接続するには、connect
メソッドを呼び出します。接続されたソケット・チャネルは、クローズするまで接続されたままになります。ソケット・チャネルが接続されているかどうかは、isConnected
メソッドの呼出しによって判断できます。
ソケット・チャネルは非ブロック接続をサポートします。ソケット・チャネルの作成とリモート・ソケットへのリンクの確立プロセスはconnect
メソッドによって開始され、後でfinishConnect
メソッドによって完了します。接続操作が実行中であるかどうかは、isConnectionPending
メソッドの呼出しによって判断できます。
ソケット・チャネルは、Channel
クラスに指定されている非同期クローズ操作とよく似た非同期停止をサポートします。一方のスレッドがソケットのチャネルに対する読込み操作の途中でブロックされているのに、もう一方のスレッドがソケットの入力側を停止した場合、ブロックされたスレッドの読込み操作は、バイトを一切読み取ることなく終了し、-1を返します。一方のスレッドがソケットのチャネルに対する書込み操作の途中でブロックされているのに、もう一方のスレッドがソケットの出力側を停止した場合、ブロックされたスレッドはAsynchronousCloseException
を受け取ります。
ソケット・オプションはsetOption
メソッドを使用して構成されます。ソケット・チャネルでは次のオプションがサポートされます。
追加(実装固有)のオプションをサポートできる場合もあります。
オプション名 説明 SO_SNDBUF
ソケット送信バッファのサイズ SO_RCVBUF
ソケット受信バッファのサイズ SO_KEEPALIVE
接続をキープアライブにします SO_REUSEADDR
アドレスを再利用します SO_LINGER
閉じるときにデータが存在する場合は遅延します(ブロック・モードに構成されている場合のみ) TCP_NODELAY
Nagleアルゴリズムを無効にします
ソケット・チャネルは、複数の並行スレッドで安全に使用できます。データグラム・チャネルは並行読み込みおよび書込みをサポートします。ただし、読込みを行うスレッドも書込みを行うスレッドも特定の時点では常に1個以下です。connect
メソッドとfinishConnect
メソッドは相互に同期しており、いずれかのメソッドの呼出し中に読み込みまたは書込み操作を開始しようとすると、この処理はその呼出しが完了するまでブロックされます。
修飾子 | コンストラクタと説明 |
---|---|
protected |
SocketChannel(SelectorProvider provider)
このクラスの新しいインスタンスを初期化します。
|
修飾子と型 | メソッドと説明 |
---|---|
abstract SocketChannel |
bind(SocketAddress local)
チャネルのソケットをローカル・アドレスにバインドします。
|
abstract boolean |
connect(SocketAddress remote)
このチャネルのソケットを接続します。
|
abstract boolean |
finishConnect()
ソケット・チャネルの接続処理を完了します。
|
abstract SocketAddress |
getLocalAddress()
このチャネルのソケットがバインドされているソケット・アドレスを返します。
|
abstract SocketAddress |
getRemoteAddress()
このチャネルのソケットが接続されているリモート・アドレスを返します。
|
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 <T> SocketChannel |
setOption(SocketOption<T> name, T value)
ソケット・オプションの値を設定します。
|
abstract SocketChannel |
shutdownInput()
チャネルを閉じずに読み込むための接続をシャットダウンします。
|
abstract SocketChannel |
shutdownOutput()
チャネルを閉じずに書き込むための接続をシャットダウンします。
|
abstract Socket |
socket()
このチャネルに関連したソケットを取得します。
|
int |
validOps()
このチャネルのサポートされている操作を識別する操作セットを返します。
|
abstract int |
write(ByteBuffer src)
このチャネルのバイト・シーケンスを指定のバッファから書き出します。
|
long |
write(ByteBuffer[] srcs)
このチャネルのバイト・シーケンスを指定されたバッファから書き出します。
|
abstract long |
write(ByteBuffer[] srcs, int offset, int length)
このチャネルのバイト・シーケンスを指定されたバッファのサブシーケンスから書き出します。
|
blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register
register
begin, close, end, isOpen
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
getOption, supportedOptions
protected SocketChannel(SelectorProvider provider)
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
)を返します。
validOps
、クラス: SelectableChannel
public abstract SocketChannel bind(SocketAddress local) throws IOException
NetworkChannel
このメソッドは、ソケットとローカル・アドレスとの間の関連付けを確立するために使用されます。関連付けが確立されると、ソケットはチャネルが閉じられるまでバインドされたままになります。local
パラメータの値がnull
の場合、ソケットは自動的に割り当てられるアドレスにバインドされます。
bind
、インタフェース: NetworkChannel
local
- ソケットのバインド先のアドレス、または自動的に割り当てられるソケット・アドレスにソケットをバインドする場合はnull
ConnectionPendingException
- このチャネルですでに非ブロック接続操作が実行中である場合AlreadyBoundException
- ソケットがすでにバインドされている場合UnsupportedAddressTypeException
- 指定されたアドレスのタイプがサポート対象外の場合ClosedChannelException
- チャネルがクローズしている場合IOException
- その他の入出力エラーが発生した場合SecurityException
- セキュリティ・マネージャがインストールされていて、そのcheckListen
メソッドが操作を拒否した場合NetworkChannel.getLocalAddress()
public abstract <T> SocketChannel setOption(SocketOption<T> name, T value) throws IOException
NetworkChannel
setOption
、インタフェース: NetworkChannel
T
- ソケット・オプション値のタイプname
- ソケット・オプションvalue
- ソケット・オプションの値。一部のソケット・オプションに対しては、null
の値が有効な値である場合があります。UnsupportedOperationException
- チャネルがソケット・オプションをサポートしていない場合IllegalArgumentException
- 値がこのソケット・オプションに対して有効な値でない場合ClosedChannelException
- このチャネルがクローズしている場合IOException
- 入出力エラーが発生した場合StandardSocketOptions
public abstract SocketChannel shutdownInput() throws IOException
読取り用にシャットダウンしたあとに、さらにそのチャネルで読取りを行うと、ストリームの終わりを示す-1
が返されます。接続の入力側がすでにシャットダウンされている場合は、このメソッドを呼び出しても何の効果もありません。
NotYetConnectedException
- このチャネルがまだ接続されていない場合ClosedChannelException
- このチャネルがクローズしている場合IOException
- その他の入出力エラーが発生した場合public abstract SocketChannel shutdownOutput() throws IOException
書込み用にシャットダウンしたあとに、さらにそのチャネルに書き込もうとすると、ClosedChannelException
がスローされます。接続の出力側がすでにシャットダウンされている場合は、このメソッドを呼び出しても何の効果もありません。
NotYetConnectedException
- このチャネルがまだ接続されていない場合ClosedChannelException
- このチャネルがクローズしている場合IOException
- その他の入出力エラーが発生した場合public abstract Socket socket()
返されるオブジェクトは、Socket
クラスで宣言されていないpublicメソッドは宣言しません。
public abstract boolean isConnected()
オープン
で接続されている場合にかぎりtruepublic 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 SocketAddress getRemoteAddress() throws IOException
チャネルがIP (Internet Protocol)ソケット・アドレスにバインドおよび接続されている場合は、このメソッドからの戻り値の型はInetSocketAddress
です。
null
ClosedChannelException
- チャネルがクローズしている場合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バイト以上が読み取られるまでこのメソッドはブロックされることになっています。
このメソッドはいつでも呼び出すことができます。ただし、ほかのスレッドがこのチャネルに対して読込み操作を開始している場合、このメソッドの呼出しは最初の操作が終わるまでブロックされます。
read
、インタフェース: ReadableByteChannel
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]に転送されます。バイト・シーケンス全部が指定されたバッファに転送されるまで、この処理が繰り返されます。各バッファには最大限のバイトが転送されるため、最終更新バッファを除く個々の更新バッファの最終的な位置は、このバッファのリミットと等しくなります。
このメソッドはいつでも呼び出すことができます。ただし、ほかのスレッドがこのチャネルに対して読込み操作を開始している場合、このメソッドの呼出しは最初の操作が終わるまでブロックされます。
read
、インタフェース: ScatteringByteChannel
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);
read
、インタフェース: ScatteringByteChannel
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バイトがすべて書き込まれると書込み操作は終了します。チャネルの種類によっては、その状態に応じて、一部のバイトしか書き込まれない場合や、まったく書込みが行われない場合もあります。たとえば非ブロック・モードのソケット・チャネルでは、ソケットの出力バッファ内のバイト数が最大書込みバイト数になります。
このメソッドはいつでも呼び出すことができます。ただし、ほかのスレッドがこのチャネルに対して書込み操作を開始している場合、このメソッドの呼出しは最初の操作が終わるまでブロックされます。
write
、インタフェース: WritableByteChannel
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バイトがすべて書き込まれると書込み操作は終了します。チャネルの種類によっては、その状態に応じて、一部のバイトしか書き込まれない場合や、まったく書込みが行われない場合もあります。たとえば非ブロック・モードのソケット・チャネルでは、ソケットの出力バッファ内のバイト数が最大書込みバイト数になります。
このメソッドはいつでも呼び出すことができます。ただし、ほかのスレッドがこのチャネルに対して書込み操作を開始している場合、このメソッドの呼出しは最初の操作が終わるまでブロックされます。
write
、インタフェース: GatheringByteChannel
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);
write
、インタフェース: GatheringByteChannel
srcs
- バイトの取得先バッファNotYetConnectedException
- このチャネルがまだ接続されていない場合ClosedChannelException
- このチャネルがクローズしている場合AsynchronousCloseException
- 書込み操作の進行中に別のスレッドによってこのチャネルがクローズされた場合ClosedByInterruptException
- 書込み中に別のスレッドからの割込みがあったためにチャネルがクローズし、現在のスレッドの割込みステータスが設定された場合IOException
- その他の入出力エラーが発生した場合public abstract SocketAddress getLocalAddress() throws IOException
チャネルがIP (Internet Protocol)ソケット・アドレスにバインド
されている場合は、このメソッドからの戻り値の型はInetSocketAddress
です。
セキュリティ・マネージャが設定されている場合は、セキュリティ・マネージャのcheckConnect
メソッドがローカル・アドレスおよび-1
を引数として呼び出され、操作が許可されるかどうかが確認されます。この操作が許可されない場合は、ループバック
・アドレスおよびチャネルのソケットのローカル・ポートを表すSocketAddress
が返されます。
getLocalAddress
、インタフェース: NetworkChannel
SocketAddress
、またはセキュリティ・マネージャによって拒否された場合はループバック・アドレスを表すSocketAddress
、またはチャネルのソケットがバインドされていない場合はnull
ClosedChannelException
- チャネルがクローズしている場合IOException
- 入出力エラーが発生した場合 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.