Class: UUID::Server
- Inherits:
-
Object
- Object
- UUID::Server
- Defined in:
- lib/uuid.rb
Overview
With UUID server you don’t have to worry about multiple processes synchronizing over the state file, calling next_sequence when forking a process and other things you’re probably not worried about (because statistically they’re very unlikely to break your code).
But if you are worried about and thought to yourself, “what would a simple UUID server look like?”, here’s the answer. The protocol is dead simple: client sends a byte, server responds with a UUID. Can use TCP or domain sockets.
Instance Method Summary collapse
-
#bind(address) ⇒ Object
Returns UNIXServer or TCPServer from address.
-
#initialize ⇒ Server
constructor
Create new server.
-
#listen(address) ⇒ Object
Start the server listening on the specific address.
Constructor Details
Instance Method Details
#bind(address) ⇒ Object
Returns UNIXServer or TCPServer from address. Returns argument if not a string, so can pass through (see #listen).
431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 |
# File 'lib/uuid.rb', line 431 def bind(address) return address unless String === address if address[0] == ?/ if File.exist?(address) raise ArgumentError, "#{address} is not a socket" unless File.socket?(address) File.unlink(address) end sock = UNIXServer.new(address) File.chmod 0666, address elsif address =~ /^(\d+\.\d+\.\d+\.\d+):(\d+)$/ sock = TCPServer.new($1, $2.to_i) else raise ArgumentError, "Don't know how to bind #{address}" end sock.setsockopt(IPPROTO_TCP, TCP_NODELAY, 1) if defined?(TCP_NODELAY) sock end |
#listen(address) ⇒ Object
Start the server listening on the specific address. Blocks and never returns. Address can be:
-
A Socket object
-
UNIX domain socket name (e.g. /var/run/uuid.sock, must start with /)
-
IP address, colon, port (e.g. localhost:1337)
418 419 420 421 422 423 424 425 426 427 |
# File 'lib/uuid.rb', line 418 def listen(address) sock = bind(address) while client = sock.accept Thread.start(client) do |socket| while socket.read 1 socket.write @generator.generate end end end end |