FlashとPerlでsocket通信をする方法 (AS3.0)
ActionScript3.0(AS3.0)とPerlを使って、簡単なsocket(ソケット)通信を行っていきます。
ローカル環境下で仮想サーバを立ち上げて、以下の順に書いています。
- サーバ側のプログラムを作る
- Perlでクライアント側のプログラムを作る
- AS3.0でクライアント側のプログラムを作る(XMLSocketクラスを使用)
Apache friendsが提供している「XAMPP」の導入が早いと思います。
http://www.apachefriends.org/jp/xampp.html
また、ステップ・バイ・ステップでインストールや設定は以下のサイトが非常に解り易く解説されています。
http://phpspot.net/php/pgXAMPP.html
まず始めにサーバ側のプログラムを作ってみます。
IO::Socketという便利なモジュールがありますので、これを使って作っていきます。
use IO::Socket; my( $port, $protocol ) = ( 9000, 'tcp' ); my $listening = IO::Socket::INET -> new( LocalPort => $port, Listen => 1, Proto => $protocol, Reuse => 1 ) or die "Couldn't start server: $!\n"; print "Server ready.\n"; while (1){ my $socket = $listening -> accept(); print "Connected.\n"; while ( <$socket> ){ print "Post: $_"; print $socket $_; } $socket -> close(); print "Disconnected.\n"; }
3行目でポート番号を指定しています。
9000で指定していますが、1025以上~65535以内であれば問題ないと思います。
起動します。
「Server ready.」と出力されれば、成功です。
「Couldn’t start server」と出力された場合、何かしらの原因で受付準備できません。仮想サーバが立ち上がっているかなど確認して、再度試みてください。
また、クライアント側の接続が切れた場合は26行目の「Disconnected.」を出力します。
次にクライアントのプログラムをPerlで作成します。必要のない場合は3の『AS3.0でクライアント側のプログラムを作る』へ進んでください。
use IO::Socket; my $host = 'localhost'; my $port = 9000; my $protocol = 'tcp'; my $socket = IO::Socket::INET->new( PeerAddr => "$host:$port", Proto => $protocol, ) or die "Couldn't connect.\n"; print "Connected Server.\n"; print $socket "sent text\n"; print my $data = <$socket>; $socket->close(); print "Disconnected.\n"; <STDIN>;
1のサーバ側のプログラムを起動した状態で、起動します。
「Post: sent text」がサーバ側のプログラム上に表示されたら成功です。
14行目でソケットに値を送っています。
15行目でソケットの値を受け取っています。
次にクライアントのプログラムをActionScript3.0で作成します。今回、XMLSocketクラス(flash.net.XMLSocket)を使用します。
var socket:XMLSocket = new XMLSocket(); var host:String = "localhost"; var port:uint = 9000; socket.connect(host, port); socket.addEventListener( Event.CONNECT, connectHandler ); socket.addEventListener( IOErrorEvent.IO_ERROR, ioErrorHandler); function connectHandler(event:Event):void { var sendText:String = "sent text"; socket.send ( sendText ); write( event.type + "\n" + sendText ); } function ioErrorHandler(event:IOErrorEvent):void { write( event.type ); } function write( s ):void{ trace( s ); socket.close(); }
2と同様に、1のサーバ側のプログラムを起動した状態で起動し、
「Post: sent text」がサーバ側のプログラム上に表示されたら成功です。
サーバへの接続が成功した場合は、8行目からconnectHandlerを通過して結果を返します。
この時、13行目でサーバへ値を送ります。
また、何かしらの原因でエラーが発生した場合は、8行目からioErrorHandlerを通過して結果を返します。