A simple `nc localhost 7000` to talk to the server
Learned a bunch of little things. More about transliterating things from Perl to Ruby.
Spent too much time trying to get /^(\w+)(?:\s+(\w+))*/ to do what I thought it would do. Doesn't even do what I think in perl. Of course the obvious
str.split(' ') didn't work till I "gave up" and thought of a programatic way to do that hypothetical regex.Then "
chan_sid = ..." didn't work, but "self.chan_sid = ..." did. I have to figure that out.#!/usr/bin/env ruby -w
require 'rubygems'
require 'eventmachine'
class CmdExecutor < EM::Connection
include EM::P::LineText2
attr_reader :port
attr_reader :cmd_prompt
attr_reader :rsp_prefix
attr_reader :greetings
attr_reader :chan
attr_accessor :chan_sid
def initialize port, chan, *args
p port, chan, args
@port = port
@chan = chan
@cmd_prompt = "[#{port}]> "
@rsp_prefix = "[#{port}]# "
@greetings = "Hello how may I be of assistance?"
console "Setting port=#{@port}"
console "Setting prompt=#{@cmd_prompt}"
console "#{self.class} initialized"
end
def console *args
puts "[#{port}] #{args.join(' ')}"
end
def send_line line
send_data(line+"\n")
end
def post_init
console "\"post_init\" for port=#{port}"
self.chan_sid = chan.subscribe { |msg| receive_chan msg }
console "channel sid = ##{chan_sid}"
send_line greetings
send_data cmd_prompt
end
def receive_chan msg
(port, cmd, *args) = *msg;
console "FROM CHANNEL(#{chan_sid}): #{cmd} #{args.join ' '}"
send_line rsp_prefix + "#{cmd} #{args.join ' '}"
end
def receive_line line
(cmd, *args) = line.split(' ')
cmd = cmd.downcase
console "RECIEVED CMD: #{cmd} #{args.join(' ')}"
case cmd
when "close"
console "\"close\" command called"
console "close_connection will be issued"
send_line rsp_prefix + cmd
close_connection_after_writing
when "quit"
console "\"quit\" command called"
console "EM.stop will be issued"
send_line rsp_prefix + cmd
EM.next_tick { EM.stop }
else
chan.push([port, cmd, *args])
console "sent to chan (#{chan_sid}) \"#{cmd} #{args.join ' '}\""
send_data cmd_prompt
end #case data
end #end def recieve_data
def unbind
console "connection closed"
chan.unsubscribe(chan_sid)
end
#private
end
EM.run {
chan = EM::Channel.new
EM.start_server("0.0.0.0", 7000, CmdExecutor, 7000, chan)
EM.start_server("0.0.0.0", 7001, CmdExecutor, 7001, chan)
}
No comments:
Post a Comment