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


まずは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]
[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]
private function handleConnectButtonClick(e:MouseEvent):void
{
sock.connect( formdata.host, formdata.port );
}
]]>
[/html]
views.ConnectionForm.mxml
[html]
public var sock:Socket;
private function handleSendButtonClidk(e:MouseEvent):void
{
if( sock.connected )
{
XML.prettyPrinting = false;
sock.writeUTF( sendXML.toXMLString() + "\n" );
sock.flush();
}
}
]]>
[/html]
とりあえず、ここまで
最終的には、mx.rpc.AbstractInvokaを継承したSocketServiceコンポーネントを作るところまでしたい。
関連記事