public abstract class SctpChannel extends AbstractSelectableChannel
SCTP チャネルは、1 つの SCTP アソシエーションのみを制御できます。このクラスのいずれかの open
メソッドを呼び出すと、SCTPChannel
が作成されます。新しく作成されたチャネルはオープンですが、接続は確立されていません。つまり、リモートピアとのアソシエーション設定はありません。未接続のチャネルに対して入出力操作を呼び出そうとすると、NotYetConnectedException
がスローされます。アソシエーションを設定するには、いずれかの connect
メソッドを使用してチャネルを接続します。接続されたチャネルは、クローズされるまで接続されたままになります。チャネルが接続されているかどうかは、getRemoteAddresses
の呼び出しによって判断できます。
SCTP チャネルは非ブロック接続をサポートします。チャネルの作成とリモートソケットへのリンクの確立プロセスの開始は connect
メソッドによって行われ、あとで finishConnect
メソッドによって完了します。接続操作が実行中であるかどうかは、isConnectionPending
メソッドの呼び出しによって判断できます。
ソケットオプションは setOption
メソッドを使用して構成されます。SCTP チャネルでは次のオプションがサポートされます。
追加 (実装固有) のオプションをサポートできる場合もあります。
オプション名 説明 SCTP_DISABLE_FRAGMENTS
メッセージの断片化を有効または無効にします SCTP_EXPLICIT_COMPLETE
明示的なメッセージの完了を有効または無効にします SCTP_FRAGMENT_INTERLEAVE
メッセージ受信者に対するメッセージの表現方法を制御します SCTP_INIT_MAXSTREAMS
アソシエーションの初期化中にローカルエンドポイントで要求されたストリームの最大数 SCTP_NODELAY
Nagle に似たアルゴリズムを有効または無効にします SCTP_PRIMARY_ADDR
ローカル SCTP スタックで、指定されたピアアドレスがアソシエーションプライマリとして使用されるように要求します SCTP_SET_PEER_PRIMARY_ADDR
囲まれたアドレスがピアによってアソシエーションプライマリとしてマークされるように要求します SO_SNDBUF
ソケット送信バッファーのサイズ SO_RCVBUF
ソケット受信バッファーのサイズ SO_LINGER
閉じるときにデータが存在する場合は遅延します (ブロックモードに構成されている場合のみ)
supportedOptions
メソッドを呼び出すと、サポートされているオプションのリストが取得されます。
SCTP チャネルは、複数の並行スレッドで安全に使用できます。データグラムチャネルは並行読み込みおよび書き込みをサポートします。ただし、読み込みを行うスレッドも書き込みを行うスレッドも特定の時点では常に 1 個以下です。connect
メソッドと finishConnect
メソッドは相互に同期しており、いずれかのメソッドの呼び出し中に送信または受信操作を開始しようとすると、この処理はその呼び出しが完了するまでブロックされます。
修飾子 | コンストラクタと説明 |
---|---|
protected |
SctpChannel(SelectorProvider provider)
このクラスの新しいインスタンスを初期化します。
|
修飾子と型 | メソッドと説明 |
---|---|
abstract Association |
association()
このチャネルのソケット上のアソシエーションを返します。
|
abstract SctpChannel |
bind(SocketAddress local)
チャネルのソケットをローカルアドレスにバインドします。
|
abstract SctpChannel |
bindAddress(InetAddress address)
指定されたアドレスをチャネルのソケットにバインドされているアドレスに追加します。
|
abstract boolean |
connect(SocketAddress remote)
このチャネルのソケットを接続します。
|
abstract boolean |
connect(SocketAddress remote, int maxOutStreams, int maxInStreams)
このチャネルのソケットを接続します。
|
abstract boolean |
finishConnect()
SCTP チャネルの接続処理を完了します。
|
abstract Set<SocketAddress> |
getAllLocalAddresses()
このチャネルのソケットがバインドされているすべてのソケットアドレスを返します。
|
abstract <T> T |
getOption(SctpSocketOption<T> name)
ソケットオプションの値を返します。
|
abstract Set<SocketAddress> |
getRemoteAddresses()
このチャネルのソケットが接続されているすべてのリモートアドレスを返します。
|
abstract boolean |
isConnectionPending()
このチャネル上で接続操作が進行中かどうかを判断します。
|
static SctpChannel |
open()
SCTP チャネルを開きます。
|
static SctpChannel |
open(SocketAddress remote, int maxOutStreams, int maxInStreams)
SCTP チャネルを開き、リモートアドレスに接続します。
|
abstract <T> MessageInfo |
receive(ByteBuffer dst, T attachment, NotificationHandler<T> handler)
指定されたバッファーへのメッセージを受信するか、通知を処理します (あるいはその両方を行います)。
|
abstract int |
send(ByteBuffer src, MessageInfo messageInfo)
このチャネル経由でメッセージを送信します。
|
abstract <T> SctpChannel |
setOption(SctpSocketOption<T> name, T value)
ソケットオプションの値を設定します。
|
abstract SctpChannel |
shutdown()
チャネルを閉じずに接続を停止します。
|
abstract Set<SctpSocketOption<?>> |
supportedOptions()
このチャネルがサポートするソケットオプションのセットを返します。
|
abstract SctpChannel |
unbindAddress(InetAddress address)
指定されたアドレスをチャネルのソケットにバインドされているアドレスから削除します。
|
int |
validOps()
このチャネルのサポートされている操作を識別する操作セットを返します。
|
blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register
register
begin, close, end, isOpen
protected SctpChannel(SelectorProvider provider)
provider
- このチャネルのセレクタプロバイダpublic static SctpChannel open() throws IOException
新しいチャネルは未バインドで未接続です。
UnsupportedOperationException
- SCTP プロトコルがサポートされていない場合IOException
- 入出力エラーが発生した場合public static SctpChannel open(SocketAddress remote, int maxOutStreams, int maxInStreams) throws IOException
これは簡易メソッドであり、次の式の評価と等価です。
open().connect(remote, maxOutStreams, maxInStreams);
remote
- 新しいチャネルの接続先リモートアドレスmaxOutStreams
- アプリケーションで送信できることを予定するストリームの数。65536
以下の正の値にする必要があります (エンドポイントのデフォルト値を使用する場合は 0
)。maxInStreams
- アプリケーションがサポートするように準備されるインバウンドストリームの最大数。65536
以下の正の値にする必要があります (エンドポイントのデフォルト値を使用する場合は 0
)。AsynchronousCloseException
- 接続操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合ClosedByInterruptException
- 接続操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込みステータスが設定された場合UnresolvedAddressException
- 指定されたリモートアドレスが完全に解決されない場合UnsupportedAddressTypeException
- 指定されたリモートアドレスのタイプがサポート対象外の場合SecurityException
- セキュリティーマネージャーがインストールされていて、指定されたリモートピアへのアクセスが許可されていない場合UnsupportedOperationException
- SCTP プロトコルがサポートされていない場合IOException
- その他の入出力エラーが発生した場合public abstract Association association() throws IOException
null
。ClosedChannelException
- チャネルがクローズしている場合IOException
- その他の入出力エラーが発生した場合public abstract SctpChannel bind(SocketAddress local) throws IOException
このメソッドは、ソケットとローカルアドレスとの間の関係を確立するために使用されます。関係が確立されると、ソケットはチャネルが閉じられるまでバインドされたままになります。この関係は unbindAddress
によって削除される可能性があるため、必ずしもアドレス local
との関係であるとはかぎりませんが、このメソッドの呼び出しが正常に完了すれば、チャネルのソケットにバインドされたローカルアドレスが必ず 1 つ以上存在します。
チャネルのソケットが (自動的に割り当てられない) 特定のアドレスに正常にバインドされると、追加のアドレスを bindAddress
を使用してバインドしたり、unbindAddress
を使用して削除したりできます。
local
- ソケットのバインド先のローカルアドレス、または自動的に割り当てられるソケットアドレスにソケットをバインドする場合は null
AlreadyConnectedException
- このチャネルがすでに接続されている場合ClosedChannelException
- このチャネルがクローズしている場合ConnectionPendingException
- このチャネルですでに非ブロック接続操作が実行中である場合AlreadyBoundException
- このチャネルがすでにバインドされている場合UnsupportedAddressTypeException
- 指定されたアドレスのタイプがサポート対象外の場合IOException
- その他の入出力エラーが発生した場合public abstract SctpChannel bindAddress(InetAddress address) throws IOException
指定されたアドレスは、wildcard
アドレスであってはいけません。このメソッドを呼び出す前に、まず bind
を使用してチャネルをバインドする必要があります。そうしなければ、NotYetBoundException
がスローされます。bind
メソッドは、引数として SocketAddress
をとります。通常は、アドレスに加えてポート番号も含まれます。チャネルの存続期間内は SCTP ポート番号は同じままであるため、その後、このメソッドを使用してバインドされたアドレスには単にアドレスのみが含まれます。
接続されたアソシエーションにアドレスを追加することはオプションの機能です。エンドポイントで動的なアドレス再構成がサポートされている場合は、ピアアドレスのリストを変更するために、適切なメッセージがピアに送信されることがあります。
address
- ソケットにバインドされたアドレスに追加されるアドレスClosedChannelException
- このチャネルがクローズしている場合ConnectionPendingException
- このチャネルですでに非ブロック接続操作が実行中である場合NotYetBoundException
- このチャネルがまだバインドされていない場合AlreadyBoundException
- このチャネルがすでに指定されたアドレスにバインドされている場合IllegalArgumentException
- アドレスが null
または wildcard
アドレスの場合IOException
- その他の入出力エラーが発生した場合public abstract SctpChannel unbindAddress(InetAddress address) throws IOException
指定されたアドレスは、wildcard
アドレスであってはいけません。このメソッドを呼び出す前に、まず bind
を使用してチャネルをバインドする必要があります。そうしなければ、NotYetBoundException
がスローされます。バインドされたアドレスの 1 つとして address
が含まれないチャネル、またはバインドされているローカルアドレスが 1 つしかないチャネルでこのメソッドが呼び出された場合は IllegalUnbindException
がスローされます。bind
を使用してチャネルのソケットがバインドされる初期アドレスは、チャネルのソケットにバインドされたアドレスから削除される可能性があります。
接続されたアソシエーションからアドレスを削除することはオプションの機能です。エンドポイントで動的なアドレス再構成がサポートされている場合は、ピアアドレスのリストを変更するために、適切なメッセージがピアに送信されることがあります。
address
- ソケットにバインドされたアドレスから削除されるアドレスClosedChannelException
- このチャネルがクローズしている場合ConnectionPendingException
- このチャネルですでに非ブロック接続操作が実行中である場合NotYetBoundException
- このチャネルがまだバインドされていない場合IllegalArgumentException
- アドレスが null
または wildcard
アドレスの場合IllegalUnbindException
- address
がチャネルのソケットにバインドされていない場合、またはチャネルにバインドされたアドレスが 1 つのみである場合IOException
- その他の入出力エラーが発生した場合public abstract boolean connect(SocketAddress remote) throws IOException
このチャネルが非ブロックモードの場合、このメソッドの呼び出しにより、非ブロック接続操作が開始されます。ローカル接続の場合のように即座に接続が確立される場合、このメソッドは true
を返します。それ以外の場合は false
を返し、あとで finishConnect
メソッドを呼び出すことにより、接続操作を完了する必要があります。
このチャネルがブロックモードの場合、このメソッドの呼び出しは、接続が確立されるか入出力エラーが発生するまでブロックされます。
セキュリティーマネージャーがインストールされている場合、このメソッドは、その checkConnect
メソッドが指定されたリモートピアのアドレスおよびポート番号への接続を許可することを確認します。
このメソッドはいつでも呼び出すことができます。このメソッドを呼び出している途中でこのチャネルに対する send
または receive
操作を呼び出した場合、最初の呼び出しが完了するまで次の呼び出しはブロックされます。接続しようとしたが失敗した場合、つまりこのメソッドの呼び出しがチェック例外をスローする場合、チャネルはクローズされます。
remote
- このチャネルの接続先リモートピアtrue
、このチャネルが非ブロックモードで接続操作の実行中である場合は false
AlreadyConnectedException
- このチャネルがすでに接続されている場合ConnectionPendingException
- このチャネルですでに非ブロック接続操作が実行中である場合ClosedChannelException
- このチャネルがクローズしている場合AsynchronousCloseException
- 接続操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合ClosedByInterruptException
- 接続操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込みステータスが設定された場合UnresolvedAddressException
- 指定されたリモートアドレスが完全に解決されない場合UnsupportedAddressTypeException
- 指定されたリモートアドレスのタイプがサポート対象外の場合SecurityException
- セキュリティーマネージャーがインストールされていて、指定されたリモートピアへのアクセスが許可されていない場合IOException
- その他の入出力エラーが発生した場合public abstract boolean connect(SocketAddress remote, int maxOutStreams, int maxInStreams) throws IOException
これは簡易メソッドであり、次の式の評価と等価です。
setOption(SctpStandardSocketOptions.SCTP_INIT_MAXSTREAMS, SctpStandardSocketOption.InitMaxStreams.create(maxInStreams, maxOutStreams)) .connect(remote);
maxOutStreams
および maxInStreams
パラメータは、アプリケーションで送受信できることを予定するストリームの最大数を表します。これらはリモートピアとネゴシエーションされますが、オペレーティングシステムにより制限されることがあります。
remote
- このチャネルの接続先リモートピアmaxOutStreams
- 65536
以下の正の値にする必要があります (エンドポイントのデフォルト値を使用する場合は 0
)。maxInStreams
- 65536
以下の正の値にする必要があります (エンドポイントのデフォルト値を使用する場合は 0
)。true
、このチャネルが非ブロックモードで接続操作の実行中である場合は false
AlreadyConnectedException
- このチャネルがすでに接続されている場合ConnectionPendingException
- このチャネルですでに非ブロック接続操作が実行中である場合ClosedChannelException
- このチャネルがクローズしている場合AsynchronousCloseException
- 接続操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合ClosedByInterruptException
- 接続操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込みステータスが設定された場合UnresolvedAddressException
- 指定されたリモートアドレスが完全に解決されない場合UnsupportedAddressTypeException
- 指定されたリモートアドレスのタイプがサポート対象外の場合SecurityException
- セキュリティーマネージャーがインストールされていて、指定されたリモートピアへのアクセスが許可されていない場合IOException
- その他の入出力エラーが発生した場合public abstract boolean isConnectionPending()
finishConnect()
メソッドを呼び出すことによってまだ完了していない場合にかぎり true
public abstract boolean finishConnect() throws IOException
ソケットチャネルを非ブロックモードにし、その connect
メソッドの 1 つを呼び出すと、非ブロック接続操作が開始されます。接続が確立されるか、接続に失敗したあと、チャネルは接続可能な状態になり、接続シーケンスを完了するために、このメソッドを呼び出すことができます。接続操作に失敗した場合、このメソッドを呼び出すと適切な IOException
がスローされます。
このチャネルがすでに接続されている場合、このメソッドはブロックされ、ただちに true を返します。このチャネルが非ブロックモードの場合、接続処理がまだ完了していなければ、このメソッドは false を返します。このチャネルがブロックモードの場合、接続が完了するか失敗するまでこのメソッドはブロックされます。なお、接続が完了した場合は true が返され、接続に失敗した場合はチェック例外がスローされます。
このメソッドはいつでも呼び出すことができます。このメソッドを呼び出している途中でこのチャネルに対する send
または receive
操作を呼び出した場合、最初の呼び出しが完了するまで次の呼び出しはブロックされます。接続しようとしたが失敗した場合、つまりこのメソッドの呼び出しがチェック例外をスローする場合、チャネルはクローズされます。
true
NoConnectionPendingException
- このチャネルが接続されておらず、接続操作も開始されていない場合ClosedChannelException
- このチャネルがクローズしている場合AsynchronousCloseException
- 接続操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合ClosedByInterruptException
- 接続操作の進行中に別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込みステータスが設定された場合IOException
- その他の入出力エラーが発生した場合public abstract Set<SocketAddress> getAllLocalAddresses() throws IOException
Set
ClosedChannelException
- チャネルがクローズしている場合IOException
- 入出力エラーが発生した場合public abstract Set<SocketAddress> getRemoteAddresses() throws IOException
チャネルが複数のアドレスにバインドされているリモートピアに接続する場合、これらのアドレスがチャネルのソケットが接続されるアドレスになります。
Set
ClosedChannelException
- チャネルがクローズしている場合IOException
- 入出力エラーが発生した場合public abstract SctpChannel shutdown() throws IOException
shutdown コマンドをリモートピアに送信することで、いずれかのピアによってあらゆる新しいデータがソケットに書き込まれることを事実上防ぎます。さらに送信すると、ClosedChannelException
がスローされます。チャネルはオープンされたままであるため、shutdown コマンドの受信前にピアが送信した可能性のあるデータ (および通知) はすべて受信できます。チャネルがすでに停止している状態でこのメソッドを呼び出しても、何の効果もありません。
NotYetConnectedException
- このチャネルがまだ接続されていない場合ClosedChannelException
- このチャネルがクローズしている場合IOException
- その他の入出力エラーが発生した場合public abstract <T> T getOption(SctpSocketOption<T> name) throws IOException
name
- ソケットオプションnull
の値が有効な値である場合があります。UnsupportedOperationException
- チャネルがソケットオプションをサポートしていない場合ClosedChannelException
- このチャネルがクローズしている場合IOException
- 入出力エラーが発生した場合SctpStandardSocketOptions
public abstract <T> SctpChannel setOption(SctpSocketOption<T> name, T value) throws IOException
name
- ソケットオプションvalue
- ソケットオプションの値。一部のソケットオプションに対しては、null
の値が有効な値である場合があります。UnsupportedOperationException
- チャネルがソケットオプションをサポートしていない場合IllegalArgumentException
- 値がこのソケットオプションに対して有効な値でない場合ClosedChannelException
- このチャネルがクローズしている場合IOException
- 入出力エラーが発生した場合SctpStandardSocketOptions
public abstract Set<SctpSocketOption<?>> supportedOptions()
このメソッドは、チャネルが閉じられたあとでも引き続きオプションのセットを返します。
public final int validOps()
SCTP チャネルは、接続、読み込み、書き込みをサポートするため、このメソッドは (SelectionKey.OP_CONNECT
| SelectionKey.OP_READ
| SelectionKey.OP_WRITE
) を返します。
validOps
、クラス: SelectableChannel
public abstract <T> MessageInfo receive(ByteBuffer dst, T attachment, NotificationHandler<T> handler) throws IOException
メッセージまたは通知をすぐに使用できる場合、またはこのチャネルがブロックモードで動作していて、最終的に使用可能になる場合は、そのメッセージが返されるか、通知が処理されます。このチャネルが非ブロックモードで動作していて、メッセージまたは通知をすぐに使用できない場合は、このメソッドはただちに null
を返します。
このメソッドがメッセージを受け取ると、そのメッセージは指定された byte バッファーにコピーされます。メッセージは指定された byte バッファーの現在位置に転送され、バッファーの位置は読み取られたバイト数だけ増分されます。バッファー内に残っているバイト数がメッセージの格納に必要なバイト数より少ない場合や、基本となる入力バッファーに完全なメッセージが含まれていない場合は、返された MessageInfo
で isComplete
を呼び出すと false
が返されます。メッセージを完全に処理するには、このメソッドをさらに呼び出す必要があります。どのストリームでも、一度に 1 つのメッセージが部分的に配信されるだけです。ソケットオプション SCTP_FRAGMENT_INTERLEAVE
は、メッセージのインタレースが発生するさまざまな側面を制御します。
このメソッドが通知を受信した場合は、指定されたハンドラの適切なメソッド (存在する場合) が呼び出されます。ハンドラで CONTINUE
が返された場合、このメソッドは別のメッセージまたは通知を受信しようとします。RETURN
が返された場合、このメソッドは null
を返します。ハンドラで非チェック例外がスローされた場合は、このメソッドからスタックまで伝播されます。
このメソッドはいつでも呼び出すことができます。別のスレッドがこのチャネルに対して受信操作をすでに開始している場合、このメソッドの呼び出しは最初の操作が終わるまでブロックされます。上記の同期ポリシーを強制するために使用されるロックを保持せずに、指定されたハンドラが呼び出された場合は、ハンドラによるほかのスレッドの受信が停止されません。ハンドラはこのチャネルの receive
メソッドを呼び出すべきではありません。呼び出した場合は、IllegalReceiveException
がスローされます。
dst
- メッセージのバイトの転送先バッファーattachment
- 受信操作に接続されるオブジェクト。次も可: null
handler
- SCTP スタックからの通知を処理するハンドラ、通知を無視する場合は null
。MessageInfo
、このチャネルが非ブロックモードで動作していて、メッセージがすぐに使用できない場合、または通知が処理されたあとに通知ハンドラが RETURN
を返した場合は null
ClosedChannelException
- このチャネルがクローズしている場合AsynchronousCloseException
- 読み取り操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合ClosedByInterruptException
- 読み取り操作の進行中に、別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込みステータスが設定された場合NotYetConnectedException
- このチャネルがまだ接続されていない場合IllegalReceiveException
- 指定されたハンドラでこのチャネルの receive
メソッドが呼び出される場合IOException
- その他の入出力エラーが発生した場合public abstract int send(ByteBuffer src, MessageInfo messageInfo) throws IOException
チャネルの動作モードが非ブロックモードで基になる出力バッファーの容量が十分である場合や、動作モードがブロックモードで十分な容量がある場合、指定された byte バッファー内に残っているバイトは単一のメッセージとして転送されます。このチャネルのソケットで明示的なメッセージの完了 SCTP_EXPLICIT_COMPLETE
ソケットオプションが有効になっていなければ、メッセージの送信はアトミックです。
メッセージは、通常の write
操作を実行した場合と同様に、byte バッファーから転送されます。
バイトは、指定された messageInfo
の streamNumber
で指定されているストリーム番号に書き込まれます。
このメソッドはいつでも呼び出すことができます。別のスレッドがこのチャネルに対して送信操作をすでに開始している場合、このメソッドの呼び出しは最初の操作が終わるまでブロックされます。
src
- 送信されるメッセージを含むバッファーmessageInfo
- 送信されるメッセージに関する補助データInvalidStreamExcepton
- streamNumner
が負の値である場合、またはそれが出力ストリームの最大数に等しいか、それよりも大きい場合ClosedChannelException
- このチャネルがクローズしている場合AsynchronousCloseException
- 読み取り操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合ClosedByInterruptException
- 読み取り操作の進行中に、別のスレッドからの割り込みがあったためにチャネルがクローズし、現在のスレッドの割り込みステータスが設定された場合NotYetConnectedException
- このチャネルがまだ接続されていない場合IOException
- その他の入出力エラーが発生した場合
Copyright © 2009, 2013, Oracle and/or its affiliates. All rights reserved.