net.excentrics.bandWidth
クラス SocketChannelWriter

java.lang.Object
  上位を拡張 net.excentrics.bandWidth.SocketChannelWriter

public class SocketChannelWriter
extends java.lang.Object

java.nio.SocketChannelの送信帯域を制限するためのクラスです。

全てのメソッドはスレッドセーフではありません。

受信の帯域を制限する機能は現在実装されていません。

使い方

                ByteBuffer buf =  ByteBuffer.allocate(BUFSIZE);
                SocketChannel sc = serverSocketChannel.accept();
                //制限速度をbandWidthに設定
                SocketChannelWriter     scw = new SocketChannelWriter(sc,bandWidth);
                while(//バッファーにデータを読み込む){
                        long nextTime = scw.write(buf);
                        sleep(nextTime);
                }
 

バージョン:
0.9
作成者:
senju

コンストラクタの概要
SocketChannelWriter(java.nio.channels.SocketChannel channel, double bandWidth)
          SocketChannelWriterを生成します。
 
メソッドの概要
 double getBandWidth()
          制限速度を返します。
 void setBandWidth(double bandWidth)
          制限速度を変更します。
 long write(java.nio.ByteBuffer buffer)
          帯域制限をかけた送出を行います。
 
クラス java.lang.Object から継承されたメソッド
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

コンストラクタの詳細

SocketChannelWriter

public SocketChannelWriter(java.nio.channels.SocketChannel channel,
                           double bandWidth)
SocketChannelWriterを生成します。

パラメータ:
channel - データの送信を行うチャネル
bandWidth - 制限速度(bit per second)
メソッドの詳細

getBandWidth

public double getBandWidth()
制限速度を返します。

戻り値:
現在設定されている制限速度(bit per second)

setBandWidth

public void setBandWidth(double bandWidth)
制限速度を変更します。

パラメータ:
bandWidth -

write

public long write(java.nio.ByteBuffer buffer)
           throws java.io.IOException

帯域制限をかけた送出を行います。

このメソッド呼び出しがブロックされることはありません。

戻り値は無視しても帯域制限は行われますが、不要なCPUリソースの消費を 避けるためには戻り値を利用してください。

パラメータ:
buffer - 送出するデータが入ったバッファ。

制限速度をbyte単位に変更した時の10分の1以上のサイズが推奨されます。

つまりgetBandWidth() / 8 / 10 以上です。

戻り値:
次回このメソッドを呼び出すまでの時間をミリ秒で返します。
つまり 「戻り値ミリ秒」経過してから続きのデータを送出してください。

この戻り値の時間が経過しないうちに再びこのメソッドを呼び出しても おそらく0バイトの送出が行われます。よって適切に帯域制限は行われますがCPU リソースを無駄に消費するだけなので、(write()は呼び出されると必ず、何バイト送出 するべきかの計算を行います。)この時間の間送出スレッドをsleep()させるなり の処理を行うことが推奨されます。

例外:
java.io.IOException - SocketChannelが例外を発生させた場合。