require "al_worker_message"
イベントハンドラ間のブロードキャストメッセージ送信を実現します。
イベントをうけたいクライアントの数が動的に変わる場合に、1:n 通信をサポートします。
複数のクライアントがサーバーに対して接続されるが、クライアントの数は特定できない場合を想定しています。
送り側
@bc = BroadcastMessage.new() @bc.send( "message here" )
受け側
def tcp_a_recv( sock, param ) @bc.attach() message = @bc.receive() ensure @bc.detach() end
@bc.receive()がコールされると動作を一旦停止し、メッセージが送られるのを待ちます。
@bc.send()をコールしてメッセージを送ると、@bc.receive()の返り値としてメッセージを受け取り、動作を再開します。
require "al_worker_message" require "al_worker_tcp" class AlWorker1 < AlWorker def initialize2() @bc = BroadcastMessage.new() @tcp = Tcp.new.run( self ) end def tcp_send( sock, param ) @bc.send( param[""] ) return true end def tcp_a_recv( sock, param ) @bc.attach() loop { message = @bc.receive() sock.puts message } ensure @bc.detach() end end AlWorker1.new.run
実行するとデフォルトのTCPポート番号、1944番で接続を待ち受けます。
接続されたクライアントから、"recv"コマンドを受信するとメッセージ受信モードになり、メッセージの発生を待ちます。
別のクライアントから、"send <message>" コマンドを送信すると、メッセージ待ちモードのクライアントにメッセージを転送します。
送信側クライアント実行例
$telnet localhost 1944 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. send MESSAGE ONE send MESSAGE TWO
受信側クライアント実行例
$telnet localhost 1944 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. recv MESSAGE ONE MESSAGE TWO