Chokeの実装
アルゴリズムとして定義することで検証可能にする
PeerInfoクラスを定義する
UnchokeしたPeerからChokeするPeerを選択する
ChokeしたPeerから、UnchokeするPeerを選択する
Chokeを実装してみましょう。Torrentクライアントの通信部分やアプリケーションの部分と、アルゴリズムの部分は分離する事が望ましいです。
このアルゴリズムじたいをテスト可能にするためです。アプリケーション層とまぜると、アプリケーションの操作としてテストしなくては検証できません。 通信部分の一部としてしまっては、通信機能としてテストする事になります。通信部分を利用しなくてはテスト出来ない状態になります。
アルゴリズムとして定義する事で、検証が容易になります。
PeerInfoクラスを定義する
Chokeアルゴリズムに必要な要素を考えて、PeerInfoというクラスを定義しました。
PeerInfoには、Peerのステータスの一覧が定義しました。
abstract class TorrentClientPeerInfo {
static const int STATE_NONE = 0;
static const int STATE_ON = 1;
static const int STATE_OFF = 2;
String ip = "";
int port = 0;
List<int> get peerId;
int get downloadedBytesFromMe;
int get uploadedBytesToMe;
int get chokedFromMe;
int get chokedToMe;
int get interestedToMe;
int get interestedFromMe;
bool get amI;
bool get isClose;
int get uploadSpeedFromUnchokeFromMe;
}前章で定義したメッセージに対応したものですね。 このListからChokeする、UnchokeするPeerの一覧を返すメソッドを作れば、Choke機能を実装したことになります。
UnchokeしたPeerからChokeするPeerを選択する
ChokeしたPeerから、UnchokeするPeerを選択する
Choke、UnchokeするPeerを選択する
今までに作成したメソッドを合わせことで実現できます。
Last updated