モジュール jdk.sctp
パッケージ com.sun.nio.sctp

クラスSctpMultiChannel

  • すべての実装されたインタフェース:
    Closeable, AutoCloseable, Channel, InterruptibleChannel

    public abstract class SctpMultiChannel
    extends AbstractSelectableChannel
    メッセージ指向のSCTPソケットの選択可能なチャネルです。

    SCTPマルチチャネルは、単一ソケットにおける多数のアソシエーションをサポートします。 このクラスのopenメソッドを呼び出すと、SctpMultiChannelが作成されます。 新しく作成されたチャネルはオープンですが、未バインドです。 バインドされていないチャネルのreceiveメソッドを呼び出そうとすると、NotYetBoundExceptionがスローされます。 バインドされていないチャネルのsendメソッドを呼び出そうとすると、最初にbindメソッドが呼び出されます。 チャネルのソケットがバインドされているアドレスは、getAllLocalAddressesを呼び出して取得できます。

    メッセージは、リモート・ピアとのアソシエーションを明示的に設定しなくても、送受信できます。 チャネルは、リモート・ピアに対してメッセージを送受信するときは常に、そのピアとのアソシエーションが存在しない場合は新しいアソシエーションを暗黙的に設定します。 正常にアソシエーションが設定されると、eventパラメータがCOMM_UPに設定されたSCTPスタックにassociation changed通知が配置されます。 receiveを呼び出すと、この通知を受信できます。

    ソケット・オプションはsetOptionメソッドを使用して構成されます。 SctpMultiChannelは次のオプションをサポートしています。

    ソケット・オプション
    オプション名 説明
    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個以下のみ存在します。

    導入されたバージョン:
    1.7
    • コンストラクタの詳細

      • SctpMultiChannel

        protected SctpMultiChannel​(SelectorProvider provider)
        このクラスの新しいインスタンスを初期化します。
        パラメータ:
        provider - このチャネルのセレクタ・プロバイダ
    • メソッドの詳細

      • open

        public static SctpMultiChannel open()
                                     throws IOException
        SCTPマルチチャネルを開きます。

        新しいチャネルは未バインドです。

        戻り値:
        新しいSCTPマルチチャネル
        例外:
        UnsupportedOperationException - SCTPプロトコルがサポートされていない場合
        IOException - 入出力エラーが発生した場合
      • associations

        public abstract Set<Association> associations()
                                               throws IOException
        このチャネルのソケット上で開いているアソシエーションを返します。

        返されるアソシエーションのセットには、COMM_UPアソシエーション変更イベントが受信されたアソシエーションのみが含まれます。 COMM_LOSTまたはSHUTDOWNアソシエーション変更イベントが受信されたアソシエーションは、アソシエーションのセットから削除されます。

        返されるアソシエーションのセットは、このメソッドが呼び出された時点で開いているアソシエーションのスナップショットです。

        戻り値:
        開いているアソシエーションが含まれるSet、開いているアソシエーションが存在しない場合は空のSet
        例外:
        ClosedChannelException - このチャネルがクローズしている場合
        IOException - その他の入出力エラーが発生した場合
      • bind

        public abstract SctpMultiChannel bind​(SocketAddress local,
                                              int backlog)
                                       throws IOException
        チャネルのソケットをローカル・アドレスにバインドし、接続を待機するようソケットを構成します。

        このメソッドは、ソケットとローカル・アドレスとの間の関係を確立するために使用されます。 関係が確立されると、ソケットはチャネルが閉じられるまでバインドされたままになります。 この関係はunbindAddressによって削除される可能性があるため、必ずしもアドレスlocalとの関係であるとはかぎりませんが、このメソッドの呼出しが正常に完了すれば、チャネルのソケットにバインドされたローカル・アドレスが必ず1つ以上存在します。

        チャネルのソケットが(自動的に割り当てられない)特定のアドレスに正常にバインドされると、追加のアドレスをbindAddressを使用してバインドしたり、unbindAddressを使用して削除したりできます。

        backlogパラメータは、ソケットの保留されている接続の最大数です。 正確なセマンティックスは実装に固有です。 実装によっては、特定の最大長が規定されていたり、パラメータが無視されたりする場合もあります。 backlogパラメータの値が0または負の値の場合は、実装固有のデフォルトが使用されます。

        パラメータ:
        local - ソケットのバインド先のローカル・アドレス、または自動的に割り当てられるソケット・アドレスにソケットをバインドする場合はnull
        backlog - 保留されている接続の最大数。
        戻り値:
        このチャネル
        例外:
        ClosedChannelException - このチャネルがクローズしている場合
        AlreadyBoundException - このチャネルがすでにバインドされている場合
        UnsupportedAddressTypeException - 指定されたアドレスのタイプがサポート対象外の場合
        SecurityException - セキュリティ・マネージャがインストールされていて、checkListenメソッドが操作を拒否した場合
        IOException - その他の入出力エラーが発生した場合
      • bind

        public final SctpMultiChannel bind​(SocketAddress local)
                                    throws IOException
        チャネルのソケットをローカル・アドレスにバインドし、接続を待機するようソケットを構成します。

        このメソッドの呼出しは、式を評価することと同様に動作します。

         bind(local, 0);
         

        パラメータ:
        local - ソケットのバインド先のローカル・アドレス、または自動的に割り当てられるソケット・アドレスにソケットをバインドする場合はnull
        戻り値:
        このチャネル
        例外:
        ClosedChannelException - このチャネルがクローズしている場合
        AlreadyBoundException - このチャネルがすでにバインドされている場合
        UnsupportedAddressTypeException - 指定されたアドレスのタイプがサポート対象外の場合
        SecurityException - セキュリティ・マネージャがインストールされていて、checkListenメソッドが操作を拒否した場合
        IOException - その他の入出力エラーが発生した場合
      • bindAddress

        public abstract SctpMultiChannel bindAddress​(InetAddress address)
                                              throws IOException
        指定されたアドレスをチャネルのソケットにバインドされているアドレスに追加します。

        指定されたアドレスは、ワイルドカード・アドレスであってはいけません。 このメソッドを呼び出す前に、まずbindを使用してチャネルをバインドする必要があります。そうしないと、NotYetBoundExceptionがスローされます。 bindメソッドは、引数としてSocketAddressを取ります。通常は、アドレスに加えてポート番号も含まれます。 チャネルの存続期間内はSCTPポート番号は同じままであるため、その後、このメソッドを使用してバインドされたアドレスにはアドレスのみが含まれます。

        このメソッドが正常に完了したあとに設定される新しいアソシエーションでは、指定されたアドレスと関連付けされます。 既存のアソシエーションにアドレスを追加することはオプションの機能です。 エンド・ポイントで動的なアドレス再構成がサポートされている場合は、ピア・アドレスのリストを変更するために、適切なメッセージがピアに送信されることがあります。

        パラメータ:
        address - ソケットにバインドされたアドレスに追加されるアドレス
        戻り値:
        このチャネル
        例外:
        ClosedChannelException - このチャネルがクローズしている場合
        NotYetBoundException - このチャネルがまだバインドされていない場合
        AlreadyBoundException - このチャネルがすでに指定されたアドレスにバインドされている場合
        IllegalArgumentException - アドレスがnullまたはwildcardアドレスの場合
        IOException - その他の入出力エラーが発生した場合
      • unbindAddress

        public abstract SctpMultiChannel unbindAddress​(InetAddress address)
                                                throws IOException
        指定されたアドレスをチャネルのソケットにバインドされているアドレスから削除します。

        指定されたアドレスは、ワイルドカード・アドレスであってはいけません。 このメソッドを呼び出す前に、まずbindを使用してチャネルをバインドする必要があります。そうしないと、NotYetBoundExceptionがスローされます。

        バインドされたアドレスの1つとしてaddressが含まれないチャネルまたはバインドされているローカル・アドレスが1つしかないチャネルでこのメソッドが呼び出された場合はIllegalUnbindExceptionがスローされます。

        bindを使用してチャネルのソケットがバインドされる初期アドレスは、チャネルのソケットにバインドされたアドレスから削除される可能性があります。

        このメソッドが正常に完了したあとに設定される新しいアソシエーションでは、指定されたアドレスと関連付けされません。 既存のアソシエーションからアドレスを削除することはオプションの機能です。 エンド・ポイントで動的なアドレス再構成がサポートされている場合は、ピア・アドレスのリストを変更するために、適切なメッセージがピアに送信されることがあります。

        パラメータ:
        address - ソケットにバインドされたアドレスから削除されるアドレス
        戻り値:
        このチャネル
        例外:
        ClosedChannelException - このチャネルがクローズしている場合
        NotYetBoundException - このチャネルがまだバインドされていない場合
        IllegalUnbindException - addressがチャネルのソケットにバインドされていない場合、またはチャネルにバインドされたアドレスが1つのみである場合
        IllegalArgumentException - アドレスがnullまたはwildcardアドレスの場合
        IOException - その他の入出力エラーが発生した場合
      • getAllLocalAddresses

        public abstract Set<SocketAddress> getAllLocalAddresses()
                                                         throws IOException
        このチャネルのソケットがバインドされているすべてのソケット・アドレスを返します。
        戻り値:
        このチャネルのソケットがバインドされているすべてのソケット・アドレス、チャネルのソケットがバインドされていない場合は空のSet
        例外:
        ClosedChannelException - チャネルがクローズしている場合
        IOException - 入出力エラーが発生した場合
      • getRemoteAddresses

        public abstract Set<SocketAddress> getRemoteAddresses​(Association association)
                                                       throws IOException
        このチャネルのソケット上の指定されたアソシエーションが接続されているすべてのリモート・アドレスを返します。
        パラメータ:
        association - アソシエーション
        戻り値:
        指定されたアソシエーションのすべてのリモート・アドレス、アソシエーションが停止している場合は空のSet
        例外:
        ClosedChannelException - チャネルがクローズしている場合
        IOException - 入出力エラーが発生した場合
      • shutdown

        public abstract SctpMultiChannel shutdown​(Association association)
                                           throws IOException
        チャネルを閉じずにアソシエーションを停止します。
        パラメータ:
        association - 停止するアソシエーション
        戻り値:
        このチャネル
        例外:
        ClosedChannelException - このチャネルがクローズしている場合
        IOException - その他の入出力エラーが発生した場合
      • getOption

        public abstract <T> T getOption​(SctpSocketOption<T> name,
                                        Association association)
                                 throws IOException
        ソケット・オプションの値を返します。

        一部のオプションがチャネルのソケットで取得されるため、associationパラメータは適用されず、指定されても無視されることに注意してください。 ただし、アソシエーション固有のオプションである場合は、そのアソシエーションを指定する必要があります。

        型パラメータ:
        T - ソケット・オプション値のタイプ
        パラメータ:
        name - ソケット・オプション
        association - オプションを取得すべきアソシエーション、このオプションをチャネルのソケット・レベルで取得すべき場合はnull
        戻り値:
        ソケット・オプションの値。 一部のソケット・オプションに対しては、nullの値が有効な値である場合があります。
        例外:
        UnsupportedOperationException - チャネルがソケット・オプションをサポートしていない場合
        ClosedChannelException - このチャネルがクローズしている場合
        IOException - 入出力エラーが発生した場合
        関連項目:
        SctpStandardSocketOptions
      • setOption

        public abstract <T> SctpMultiChannel setOption​(SctpSocketOption<T> name,
                                                       T value,
                                                       Association association)
                                                throws IOException
        ソケット・オプションの値を設定します。

        一部のオプションがチャネルのソケットで取得されるため、associationパラメータは適用されず、指定されても無視されることに注意してください。 ただし、アソシエーション固有のオプションである場合は、そのアソシエーションを指定する必要があります。

        型パラメータ:
        T - ソケット・オプション値のタイプ
        パラメータ:
        name - ソケット・オプション
        association - オプションを設定すべきアソシエーション、このオプションをチャネルのソケット・レベルで設定すべき場合はnull
        value - ソケット・オプションの値。 一部のソケット・オプションに対しては、nullの値が有効な値である場合があります。
        戻り値:
        このチャネル
        例外:
        UnsupportedOperationException - チャネルがソケット・オプションをサポートしていない場合
        IllegalArgumentException - 値がこのソケット・オプションに対して有効な値でない場合
        ClosedChannelException - このチャネルがクローズしている場合
        IOException - 入出力エラーが発生した場合
        関連項目:
        SctpStandardSocketOptions
      • supportedOptions

        public abstract Set<SctpSocketOption<?>> supportedOptions()
        このチャネルがサポートするソケット・オプションのセットを返します。

        このメソッドは、チャネルが閉じられたあとでも引き続きオプションのセットを返します。

        戻り値:
        このチャネルでサポートされるソケット・オプションのセット
      • validOps

        public final int validOps()
        このチャネルのサポートされている操作を識別する操作セットを返します。

        SCTPマルチチャネルは、読み込みと書込みをサポートするため、このメソッドは(SelectionKey.OP_READ | SelectionKey.OP_WRITE)を返します。

        定義:
        validOps 、クラス:  SelectableChannel
        戻り値:
        有効な操作セット
      • receive

        public abstract <T> MessageInfo receive​(ByteBuffer buffer,
                                                T attachment,
                                                NotificationHandler<T> handler)
                                         throws IOException
        このチャネル経由でメッセージを受信するか、通知を処理します(あるいはその両方を行います)。

        メッセージまたは通知をすぐに使用できる場合、またはこのチャネルがブロック・モードで動作していて、最終的に使用可能になる場合は、そのメッセージが返されるか、通知が処理されます。 このチャネルが非ブロック・モードで動作していて、メッセージまたは通知をすぐに使用できない場合は、このメソッドはただちにnullを返します。

        このメソッドがメッセージを受け取ると、そのメッセージは指定されたbyteバッファにコピーされ、MessageInfoが返されます。 メッセージは指定されたbyteバッファの現在位置に転送され、バッファの位置は読み取られたバイト数だけ増分されます。 バッファ内に残っているバイト数がメッセージの格納に必要なバイト数より少ない場合や、基本となる入力バッファに完全なメッセージが含まれていない場合は、返された MessageInfoisCompleteを呼び出すとfalseが返されます。メッセージを完全に処理するには、このメソッドをさらに呼び出す必要があります。 どのストリームでも、一度に1つのメッセージが部分的に配信されるのみです。 ソケット・オプションSCTP_FRAGMENT_INTERLEAVEは、メッセージのインタレースが発生する様々な側面を制御します。

        このメソッドが通知を受信した場合は、指定されたハンドラの適切なメソッド(存在する場合)が呼び出されます。 ハンドラでCONTINUEが返された場合、このメソッドは別のメッセージまたは通知を受信しようとします。RETURNが返された場合、このメソッドはnullを返します。 ハンドラでキャッチされない例外がスローされた場合は、その例外がこのメソッドからスタックまで伝播されます。

        セキュリティ・マネージャがインストールされている場合、このメソッドは新しい各アソシエーション設定のアソシエーションのソース・アドレスおよびポート番号がセキュリティ・マネージャのcheckAcceptメソッドによって許可されていることを確認します。

        このメソッドはいつでも呼び出すことができます。 別のスレッドがこのチャネルに対して受信操作をすでに開始している場合、このメソッドの呼出しは最初の操作が終わるまでブロックされます。 前述の同期ポリシーを強制するために使用されるロックを保持せずに、指定されたハンドラが呼び出された場合は、ハンドラによる他のスレッドの受信が停止されません。 ハンドラは、このチャネルのreceiveメソッドを呼び出すことはできません。呼び出した場合は、IllegalReceiveExceptionがスローされます。

        型パラメータ:
        T - 接続の型
        パラメータ:
        buffer - バイトの転送先バッファ
        attachment - 受信操作に接続されるオブジェクト。次も可: null
        handler - SCTPスタックからの通知を処理するハンドラ、通知を無視する場合はnull
        戻り値:
        MessageInfo、このチャネルが非ブロック・モードで動作していて、メッセージがすぐに使用できない場合、または通知が処理されたあとに通知ハンドラがRETURNを返す場合はnull
        例外:
        ClosedChannelException - このチャネルがクローズしている場合
        AsynchronousCloseException - 読取り操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合
        ClosedByInterruptException - 読取り操作の進行中に、別のスレッドからの割込みがあったためにチャネルがクローズし、現在のスレッドの割込みステータスが設定された場合
        NotYetBoundException - このチャネルがまだバインドされていない場合
        IllegalReceiveException - 指定されたハンドラでこのチャネルのreceiveメソッドが呼び出される場合
        SecurityException - セキュリティ・マネージャがインストールされていて、メッセージの送信側が新しいアソシエーションの受け入れを許可していない場合
        IOException - その他の入出力エラーが発生した場合
      • send

        public abstract int send​(ByteBuffer buffer,
                                 MessageInfo messageInfo)
                          throws IOException
        このチャネル経由でメッセージを送信します。

        このチャネルが未バウンドの場合、このメソッドはデータの送信前にbind(null, 0)を呼び出します。

        このチャネルのソケットと意図された受信側(指定されたmessageInfo内のアドレスで識別)との間にアソシエーションが存在しない場合は、意図された受信側にアソシエーションが自動的に設定されます。 これは、暗黙的なアソシエーション設定であると考えられます。 正常にアソシエーションが設定されると、eventパラメータがCOMM_UPに設定されたSCTPスタックにassociation changed通知が配置されます。 receiveを呼び出すと、この通知を受信できます。

        このチャネルがブロック・モードで、基になる出力バッファに十分な容量がある場合、指定されたbyteバッファ内に残っているバイトは単一のメッセージとして転送されます。 このチャネルのソケットで明示的なメッセージの完了SCTP_EXPLICIT_COMPLETEソケット・オプションが有効になっていなければ、メッセージの送信はアトミックです。

        このチャネルが非ブロック・モードで、基になる出力バッファに十分な容量があり、暗黙的なアソシエーション設定が必要な場合、SCTP_EXPLICIT_COMPLETEに従って、指定されたbyteバッファ内に残っているバイトは単一のメッセージとして転送されます。 何らかの理由でメッセージを配信できない場合、eventパラメータがCANT_STARTに設定された状態でassociation changed通知がSCTPスタックに配置されます。

        メッセージは、通常のwrite操作を実行した場合と同様に、byteバッファから転送されます。

        セキュリティ・マネージャがインストールされている場合、このメソッドは新しい各アソシエーション設定の指定されたリモート・ピアのアドレスおよびポート番号がセキュリティ・マネージャのcheckConnectメソッドによって許可されていることを確認します。

        このメソッドはいつでも呼び出すことができます。 別のスレッドがこのチャネルに対して送信操作をすでに開始している場合、このメソッドの呼出しは最初の操作が終わるまでブロックされます。

        パラメータ:
        buffer - 送信されるメッセージを含むバッファ
        messageInfo - 送信されるメッセージに関する補助データ
        戻り値:
        送信バイト数(このメソッドを呼び出したときにメッセージ・バッファ内に残っていたバイト数)。このチャネルが非ブロック・モードで動作しており、基準となる出力バッファの容量が不十分なためメッセージが収まりきらない場合はゼロ
        例外:
        InvalidStreamException - streamNumberが負の値である場合、またはアソシエーションがすでに存在していてstreamNumberが出力ストリームの最大数よりも大きい場合
        ClosedChannelException - このチャネルがクローズしている場合
        AsynchronousCloseException - 読取り操作の進行中に、別のスレッドによってこのチャネルがクローズされた場合
        ClosedByInterruptException - 読取り操作の進行中に、別のスレッドからの割込みがあったためにチャネルがクローズし、現在のスレッドの割込みステータスが設定された場合
        SecurityException - セキュリティ・マネージャがインストールされていて、新しい関連付けがメッセージ・アドレスで設定されることを許可していない場合
        IOException - その他の入出力エラーが発生した場合
      • branch

        public abstract SctpChannel branch​(Association association)
                                    throws IOException
        アソシエーションを分岐します。

        アプリケーションはこのメソッドを呼び出して、アソシエーションを異なるチャネルに分岐できます。 アソシエーションに新しくバインドおよび接続されたSctpChannelが作成されます。 分岐されたアソシエーションは、このチャネルの一部ではなくなります。

        これは、たとえばアプリケーションで、散発的に発生する複数の送信側/受信側を元のSCTPマルチチャネルに残したまま、大量のデータ・トラフィックを伝送するアソシエーションを専用の独立SCTPチャネルに分岐する場合に、特に役立ちます。

        パラメータ:
        association - 分岐するアソシエーション
        戻り値:
        SctpChannel
        例外:
        ClosedChannelException - このチャネルがクローズしている場合
        IOException - その他の入出力エラーが発生した場合