import "netchan"

netchanパッケージは、ネットワークに対応した型セーフなチャネルを実装しています。このチャネルの両端は、ネットワークにつながれた異なるコンピュータ上に置かれます。一方のマシン上のチャネルに送信された転送データは、もう一方のマシン上の同型のチャネルから受信され、元通りに再生されます。

まず、エクスポート側は、一組のチャネルの名前を公開します。インポート側は、エクスポートしているマシーンに接続し、名前を使ってチャネルをインポートします。チャネルがインポートされたあとは、2つのマシーンにおいて、通常のチャネルと同じように扱えるようになります。

このネットワークに対応したチャネルは同期されません。このチャネルは、常に1要素以上持つチャネルのように振舞います。

パッケージファイル

common.go export.go import.go

Dir型

クライアント側から見た通信方向。

type Dir int
const (
    Recv Dir = iota
    Send
)

(Dir) String関数

func (dir Dir) String() string

Exporter型

Exporterは、一組のチャネルを指定したネットワークポート上に公開します。1つのマシーンが複数のExporterを持つこともできますが、それぞれ異なるポートを使わなければなりません。

type Exporter struct {
    // contains unexported fields
}

NewExporter関数

func NewExporter(network, localaddr string) (*Exporter, os.Error)

NewExporterは、チャネルをネットワーク上の指定したローカルアドレス(net.Listenを参照)にエクスポートする新しいExporterを作成します。

(*Exporter) Addr関数

func (exp *Exporter) Addr() net.Addr

Addrは、Exporterのローカルネットワークアドレスを返します。

(*Exporter) Drain関数

func (exp *Exporter) Drain(timeout int64) os.Error

Drainは、このexporter/importerから、すべてのメッセージが送信されるまで待ちます。これには、クライアントにまだ送られていないメッセージだけでなく、おそらくDrainの実行中に、importerによって受信されたものも含みます。要するに、すべてのexporterのメッセージがクライアントに受け取られるまで、この関数は待ち続けます。timeout(単位はナノ秒)が正の数で、かつDrainの実行完了にそれ以上の時間が掛かったときは、エラーが返されます。

(*Exporter) Export関数

func (exp *Exporter) Export(name string, chT interface{}, dir Dir) os.Error

Exportは、指定した型と方向を持つチャネルをエクスポートします。この呼び出しに渡している、エクスポート対象のチャネルは、それぞれ固有の型を持つことができます。実際に使用するシグネチャは、このシグネチャではなく、下のようになります。

Export(name string, chT chan T, dir Dir)

(*Exporter) Hangup関数

func (exp *Exporter) Hangup(name string) os.Error

Hangupは、指定した名前のチャネルをExporterから切り離し、チャネルをクローズします。このチャネルに送信中のメッセージは破棄される可能性があります。

(*Exporter) Sync関数

func (exp *Exporter) Sync(timeout int64) os.Error

Syncは、このSyncを実行した時点で送信済みのメッセージを、exporterのすべてのクライアントが受信するまで待ちます。Drainとは異なり、この関数の実行中に送信されたメッセージ、および、どのクライアントにも送られなかったメッセージに対しては待ちません。timeout(単位はナノ秒)が正の数で、かつSyncの実行完了にそれ以上の時間が掛かったときは、エラーが返されます。

Importer型

Importerは、リモートマシン/ネットワークポートから一組のチャネルをインポートします。同一のリモートマシン/ネットワークポートから複数のインポートを行うことも可能です。

type Importer struct {
    // contains unexported fields
}

NewImporter関数

func NewImporter(network, remoteaddr string) (*Importer, os.Error)

NewImporterは、ネットワーク上の指定したリモートアドレス(net.Dialを参照)からチャネルをインポートする、新しいImporterオブジェクトを作成します。Importerの作成時には、相手側となるExporterの準備が整っている必要があります。

(*Importer) Errors関数

func (imp *Importer) Errors() chan os.Error

Errorsは、転送エラーまたはプロトコルエラーを読み出せるチャネルを返します。正常時には、Importerのクライアントは、このエラーチャネルから読み出しを行う必要はありませんが、このエラーチャネルから読み出しを行わないと、あまりに多くのエラーが発生したとき、このImporterはシャットダウンされます。

(*Importer) Hangup関数

func (imp *Importer) Hangup(name string) os.Error

Hangupは、指定した名前のチャネルをImporterから切り離し、チャネルをクローズします。このチャネルに送信中のメッセージは破棄される可能性があります。

(*Importer) Import関数

func (imp *Importer) Import(name string, chT interface{}, dir Dir) os.Error

Importは、指定した型と方向を持つチャネルをインポートします。これは、ImportNValuesの最後のパラメータを-1、すなわち上限なしで呼び出したことと同じです。

(*Importer) ImportNValues関数

func (imp *Importer) ImportNValues(name string, chT interface{}, dir Dir, n int) os.Error

ImportNValuesは、指定した型と方向、および送受信上限値nを持つチャネルをインポートします。nの値が-1のときは上限なしとなります。この呼び出しで渡しているリモートサイトのチャネルと結びつけるチャネルは、それぞれ固有の型を持つことができます。実際に使用するシグネチャは、このシグネチャではなく、下のようになります。

ImportNValues(name string, chT chan T, dir Dir, n int) os.Error

以下は使用例です。

imp, err := NewImporter("tcp", "netchanserver.mydomain.com:1234")
if err != nil { log.Exit(err) }
ch := make(chan myType)
err = imp.ImportNValues("name", ch, Recv, 1)
if err != nil { log.Exit(err) }
fmt.Printf("%+v\n", <-ch)