lib/chain-reactor/client.rb
require 'socket'
require 'json'
module ChainReactor
# An error raised if there are communication problems with the server.
class ClientError < StandardError
end
# A client for connecting to a chain reactor server.
class Client
# The version of the chain reactor server.
attr_reader :version
# Create a connection to a chain reactor server at the given address and port.
def initialize(server_addr,server_port)
begin
@socket = TCPSocket.new(server_addr, server_port)
rescue Errno::ECONNREFUSED
raise ClientError, "Failed to connect to Chain Reactor server on #{server_addr}:#{server_port}"
end
connect
end
# Send hash data to the server as a JSON
def send_as_json(data_hash)
if data_hash.length > 0
json_string = JSON.generate(data_hash)
send(json_string)
else
raise ClientError, 'Cannot send empty data to chain reactor server'
end
end
# Send a data string to the server
def send(data_string)
if data_string.length > 0
puts "Sending data: #{data_string}"
@socket.puts data_string
else
raise ClientError, 'Cannot send empty data to chain reactor server'
end
end
# Close the client socket.
def close
@socket.close
end
private
# Connect and check the server response.
def connect
intro = @socket.gets
matches = /^ChainReactor v([\d.]+)/.match(intro)
if matches
@version = matches[1]
else
@socket.close
raise ClientError, "Invalid server response: #{intro}"
end
end
end
end