(2008/12/2追記)XMLSocketServer最新版はbitbucketにあります。.NET用のXMLSocketClientも実装しました



前に作ったAS2.0用のこれ → s.h.log: C#に埋め込んだFlashと通信するライブラリ

のかわりに、最近AS3をメインに使っているので、C#2.0とFlash(AS3.0)間でメッセージをやりとりするための「XMLSocketCommand」というものを作った。

両者からオブジェクトをXMLにして送って、もう片方で受け取ったらまたオブジェクトに戻す事が簡単にできるC#とActionScript用のクラス群と、そのサンプルプロジェクトを用意したので公開しておきます。

■ソースコード&サンプルプロジェクト

AS3.0 sample+source code (FlashCS3), archive

C#2.0 sample+source code (VisualStudio2005), archive

■サンプルプロジェクトの中身

こんなもの。詳しくは中の、それぞれForm1.csとCommandTest.asから呼び出しているのでコード読

XMLSocket Command

コマンド受信してからの処理が結構綺麗に書けるようになってる

publicfunctioncmd_onRecv(e:CommandEvent){

trace(“Receive:”+e.command.toString());//受信したコマンド

switch(e.command.name){

case”zanmai”:

trace(“今年はざんまいに”+e.command.value+”回行く!”);

break;

case”kazusuke”:

trace(“かず助にも”+e.command.value+”回行きたい”);

break;

default:

trace(“知らないコマンドが来た”);

break;

}

}

C#の方は、前に作ったC#用のXMLSocketServerクラスをラップした、Org.Shokai.Net.XMLSocket.Commanderというクラスが全部やってくれる。

ASの方は、XMLSocketを継承したCommanderクラスが全部やってくれる。

AS,C#両方ともそれぞれ持っているCommandというクラスにparseXML()、toXML()、toXMLString()というメソッドがあって、そこでオブジェクト/XMLの変換方法を定義している。

今はnameとvalueの2つの値だけをやりとりする様になっているだけだが、もっと複雑なデータをやりとりしたければ自分でCommandを継承してparseXML()、toXML()、toXMLString()をoverrideすればいい。



■まず接続する

C#をXMLSocketサーバーとして起動し、適当なportを開けて待機する。

Commandercommander=newCommander();

commander.Listen(IPAddress.Any,5500);//5500ポートで待機

そこにFlashから接続する。127.0.0.1はlocalhost(自分)の事

varcommander=newCommander();

commander.connect(127.0.0.1,5500);//接続

一つのサーバーに対して複数のFlashを接続できる。同時接続数の制限方法や、サーバーの動作の詳細はC#用XMLSocketServerクラスを参照

■C#からコマンド送信して、Flashで受信する

Commandオブジェクトを作って、送信する。送信先は、Flashのクライアントがたくさん接続してくるので番号かTcpClinetオブジェクトで指定しなければならない。

Commandcmd=newCommand();

cmd.name=”zanmai”;

cmd.value=”365″;

commander.Send(cmd,0);

全員に送る事も出来る。

commander.Broadcast(cmd);

受信は、まず受信イベントをEventDispatcherで登録しておいて

commander.addEventListener(CommandEvent.ON_COMMAND,cmd_onRecv);//データ受信イベント

こう受信する

publicfunctioncmd_onRecv(e:CommandEvent){

trace(“Receive:”+e.command.toString());//受信したコマンド

switch(e.command.name){

case”zanmai”:

trace(“今年はざんまいに”+e.command.value+”回行く!”);

break;

case”kazusuke”:

trace(“かず助にも”+e.command.value+”回行きたい”);

break;

default:

trace(“知らないコマンドが来た”);

break;

}

}

■Flashからコマンド送信して、C#で受信する

C#から送る時と同じく、Commandオブジェクトを作成して送る。この場合は送信先は1つなので、指定する必要はない。

varcmd:Command=newCommand();

cmd.name=”eat”;

cmd.value=”1000″;

commander.sendCommand(cmd);//コマンド送信

C#も、受信イベントを登録する。delegateなので関数名を+=すると登録できる。

commander.onRecvCommand+=onRecvCommand;

受信時に呼び出される関数の例

privatevoidonRecvCommand(Org.Shokai.Net.XMLSocket.Commandcommand)

{

Console.WriteLine(“RecvCommand=>”+command.ToString());

switch(command.name)

{

case”get”:

Console.WriteLine(command.value+”個取るよ”);

break;

case”eat”:

Console.WriteLine(command.value+”皿食べるよ”);

break;

default:

Console.WriteLine(“知らないコマンド名だ”);

break;

}

}

>とか/とか?みたいな文字もちゃんと送受信できてるので、バイナリもBase64エンコードとかしたら送れるのかな?そのうち試す。

name, valueの他にfrom, to変数があるけどまだ使われてないのは、また今度拡張します。

その他のエラー処理や、接続/切断などの判断はサンプルプロジェクトの中を見れば大体やってるのでわかると思う。

まあ、面倒ならやらなくてもいいんじゃないかな