Mini Shell
--- !ruby/object:RI::ClassDescription
attributes:
- !ruby/object:RI::Attribute
comment:
name: audit
rw: RW
- !ruby/object:RI::Attribute
comment:
name: debug
rw: RW
- !ruby/object:RI::Attribute
comment:
name: host
rw: R
- !ruby/object:RI::Attribute
comment:
name: maxConnections
rw: R
- !ruby/object:RI::Attribute
comment:
name: port
rw: R
- !ruby/object:RI::Attribute
comment:
name: stdlog
rw: RW
class_methods:
- !ruby/object:RI::MethodSummary
name: in_service?
- !ruby/object:RI::MethodSummary
name: new
- !ruby/object:RI::MethodSummary
name: stop
comment:
- !ruby/struct:SM::Flow::P
body: GServer implements a generic server, featuring thread pool management, simple logging, and multi-server management. See HttpServer in <tt>xmlrpc/httpserver.rb</tt> in the Ruby standard library for an example of GServer in action.
- !ruby/struct:SM::Flow::P
body: Any kind of application-level server can be implemented using this class. It accepts multiple simultaneous connections from clients, up to an optional maximum number. Several <em>services</em> (i.e. one service per TCP port) can be run simultaneously, and stopped at any time through the class method <tt>GServer.stop(port)</tt>. All the threading issues are handled, saving you the effort. All events are optionally logged, but you can provide your own event handlers if you wish.
- !ruby/struct:SM::Flow::H
level: 3
text: Example
- !ruby/struct:SM::Flow::P
body: "Using GServer is simple. Below we implement a simple time server, run it, query it, and shut it down. Try this code in <tt>irb</tt>:"
- !ruby/struct:SM::Flow::VERB
body: " require 'gserver'\n\n #\n # A server that returns the time in seconds since 1970.\n #\n class TimeServer < GServer\n def initialize(port=10001, *args)\n super(port, *args)\n end\n def serve(io)\n io.puts(Time.now.to_i)\n end\n end\n\n # Run the server with logging enabled (it's a separate thread).\n server = TimeServer.new\n server.audit = true # Turn logging on.\n server.start\n\n # *** Now point your browser to http://localhost:10001 to see it working ***\n\n # See if it's still running.\n GServer.in_service?(10001) # -> true\n server.stopped? # -> false\n\n # Shut the server down gracefully.\n server.shutdown\n\n # Alternatively, stop it immediately.\n GServer.stop(10001)\n # or, of course, "server.stop".\n"
- !ruby/struct:SM::Flow::P
body: All the business of accepting connections and exception handling is taken care of. All we have to do is implement the method that actually serves the client.
- !ruby/struct:SM::Flow::H
level: 3
text: Advanced
- !ruby/struct:SM::Flow::P
body: As the example above shows, the way to use GServer is to subclass it to create a specific server, overriding the <tt>serve</tt> method. You can override other methods as well if you wish, perhaps to collect statistics, or emit more detailed logging.
- !ruby/struct:SM::Flow::VERB
body: " connecting\n disconnecting\n starting\n stopping\n"
- !ruby/struct:SM::Flow::P
body: The above methods are only called if auditing is enabled.
- !ruby/struct:SM::Flow::P
body: You can also override <tt>log</tt> and <tt>error</tt> if, for example, you wish to use a more sophisticated logging system.
constants:
- !ruby/object:RI::Constant
comment:
name: DEFAULT_HOST
value: "\"127.0.0.1\""
full_name: GServer
includes: []
instance_methods:
- !ruby/object:RI::MethodSummary
name: connecting
- !ruby/object:RI::MethodSummary
name: connections
- !ruby/object:RI::MethodSummary
name: disconnecting
- !ruby/object:RI::MethodSummary
name: error
- !ruby/object:RI::MethodSummary
name: join
- !ruby/object:RI::MethodSummary
name: log
- !ruby/object:RI::MethodSummary
name: serve
- !ruby/object:RI::MethodSummary
name: shutdown
- !ruby/object:RI::MethodSummary
name: start
- !ruby/object:RI::MethodSummary
name: starting
- !ruby/object:RI::MethodSummary
name: stop
- !ruby/object:RI::MethodSummary
name: stopped?
- !ruby/object:RI::MethodSummary
name: stopping
name: GServer
superclass: Object
Zerion Mini Shell 1.0