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 |
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
getLocalAddress, getOption, supportedOptions
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
) を返します。
validOps
、クラス: SelectableChannel
public abstract SocketChannel bind(SocketAddress local) throws IOException
NetworkChannel
このメソッドは、ソケットとローカルアドレスとの間の関連付けを確立するために使用されます。関連付けが確立されると、ソケットはチャネルが閉じられるまでバインドされたままになります。local
パラメータの値が null
の場合、ソケットは自動的に割り当てられるアドレスにバインドされます。
bind
、インタフェース: NetworkChannel
local
- ソケットのバインド先のアドレス、または自動的に割り当てられるソケットアドレスにソケットをバインドする場合は null
ConnectionPendingException
- このチャネルですでに非ブロック接続操作が実行中である場合AlreadyBoundException
- ソケットがすでにバインドされている場合UnsupportedAddressTypeException
- 指定されたアドレスのタイプがサポート対象外の場合ClosedChannelException
- チャネルがクローズしている場合IOException
- その他の入出力エラーが発生した場合NetworkChannel.getLocalAddress()
public abstract <T> SocketChannel setOption(SocketOption<T> name, T value) throws IOException
NetworkChannel
setOption
、インタフェース: NetworkChannel
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 ソケットアドレスにバインドおよび接続されている場合は、このメソッドからの戻り値の型は 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
- その他の入出力エラーが発生した場合 バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.