[ruby][flex] Socketサーバを書いてみた

FlexでXMLSocketする必要があったので、テスト用にサーバを書いてみたよ。 自信はないので、1%も保証はないけど一応動く。

sockettest1pnf.png

sockettest2.png

ソースファイル

まずはRubyのソース

server_client.rb [ruby] require “socket_server” server = SocketServer.new server.open 8001 [/ruby]

ソケットサーバを8001番ポートでオープン

socket_server.rb [ruby] class SocketServer

def initialize( port=nil ) puts “create server..” @port = port || 8001; end

def open( port=nil ) @port = port if( !port.nil? ) @gs = TCPServer.open @port @clients = [] puts “open server #{@port}”

while true
  Thread.start( @gs.accept ) do |s|
    open_client s
    while ( message = s.gets )
      send_message_all( message )
    end
    close_client s
  end
end

end

def open_client( client ) puts “#{client} is connected.” @clients << client end

def close_client( client ) puts “#{client} is closed.” @clients.delete client end

def send_message_all( message ) puts “[message all] #{message}” @clients.each do |client| send_message( client, message ) end end

# send message to IOSocket def send_message( target, message ) message.chomp! target.write( message << “\n” ) end

end [/ruby]

そしてFlex2のソース

Socketクラスを使ってます。 XMLSocketクラスを使ったら、メッセージのタイミングが1個ずれました。

SocketTest.mxml [html]

<![CDATA[ import flash.net.Socket;

  [Bindable]
  public var sock:Socket;

  private function handleCreateComplete():void
  {
    sock = new Socket();
    sock.addEventListener(ProgressEvent.SOCKET_DATA,handleSocketData);
    sock.addEventListener(Event.CONNECT,handleSocketConnect);
    sock.addEventListener(Event.CLOSE,handleSocketClose);
    //sock.addEventListener(DataEvent.DATA,handleSocketData);
    sock.addEventListener(IOErrorEvent.IO_ERROR,handleSocketIOError);
  }

  private function handleSocketConnect(e:Event):void
  {
    debugger.text += “Connection Success.\n”;
    formViewStack.selectedChild = connectedForm;
    sock.removeEventListener(Event.CONNECT,arguments.callee);
  }

  private function handleSocketClose(e:Event):void
  {
    debugger.text += “Connection Close.\n”;
    formViewStack.selectedChild = connectForm;
    sock.removeEventListener(Event.CLOSE,arguments.callee);
  }

  private function handleSocketData(e:ProgressEvent):void
  {
    debugger.text += e.target.readUTF();
  }

  private function handleSocketIOError(e:IOError):void
  {
    trace(e);
  }

]]>

<mx:VDividedBox width="100%" height="100%">

  <mx:ViewStack id="formViewStack" width="100%" height="200">

    <views:ConnectForm id="connectForm" sock="{sock}" />
    <views:ConnectionForm id="connectedForm" sock="{sock}" />

  </mx:ViewStack>

  <mx:TextArea width="100%" id="debugger"/>

</mx:VDividedBox>

[/html]

views.ConnectForm.mxml [html] <![CDATA[ public var sock:Socket;

  private function handleConnectButtonClick(e:MouseEvent):void
  {
    sock.connect( formdata.host, formdata.port );
  }

]]>

{txtHost.text} {int(txtPort.text)}

[/html]

views.ConnectionForm.mxml [html] <![CDATA[

  public var sock:Socket;

  private function handleSendButtonClidk(e:MouseEvent):void
  {
    if( sock.connected )
    {
      XML.prettyPrinting = false;
      sock.writeUTF( sendXML.toXMLString() + "\n" );
      sock.flush();
    }
  }

]]>

{txtMessage.text}

[/html]

とりあえず、ここまで

最終的には、mx.rpc.AbstractInvokaを継承したSocketServiceコンポーネントを作るところまでしたい。

関連記事

  1. インスタンス変数のオーバーライド
  2. FlashCS3でお絵かきツール
  3. as3版 CrossDrawer
  4. [Flex]ログを取る
  5. ActionScript3とProcessingの勉強2
Posted in actionscript3.0, flex, ruby, 日記 at 10月 30th, 2007. Trackback URI: trackback

No Responses to “[ruby][flex] Socketサーバを書いてみた”

Leave a Reply