# File src/ruby_supportlib/phusion_passenger/message_client.rb, line 42
    def initialize(username, password, address)
      @socket = connect_to_server(address)
      begin
        @channel = MessageChannel.new(@socket)

        result = @channel.read
        if result.nil?
          raise EOFError
        elsif result.size != 2 || result[0] != "version"
          raise IOError, "The message server didn't sent a valid version identifier"
        elsif result[1] != "1"
          raise IOError, "Unsupported message server protocol version #{result[1]}"
        end

        @channel.write_scalar(username)
        @channel.write_scalar(password)

        result = @channel.read
        if result.nil?
          raise EOFError
        elsif result[0] != "status"
          raise ProtocolError, "Invalid authentication response: expected \"status\", got #{result[0].inspect}"
        elsif result[1] == "ok"
          # Do nothing
        elsif result[1] == "error"
          if result[2]
            raise SecurityError, "Authentication error: #{result[2]}"
          else
            raise SecurityError, "Authentication error (no server message given)"
          end
        else
          raise ProtocolError, "Invalid authentication response: #{result.inspect}"
        end
      rescue Exception
        @socket.close
        raise
      end
    end