private void initSocServer(String databaseUserName, String databasePassword, Properties props)
    {
        printVersionText();
        
        /* Check for problems during super setup (such as port already in use) */
        if (error != null)
        {
            System.err.println("* Exiting due to network setup problem: " + error.toString());
            System.exit (1);
        }

        if (props == null)
        {
            this.props = new Properties();
        } else {
            this.props = props;
        }

        try
        {
            // false indicates no connection for valid reason (e.g. disabled)
            if (SOCDBHelper.initialize(props))
                System.err.println("User database initialized.");
            else
                System.err.println("User database disabled.");
        }
        catch (SQLException x) // just a warning
        {
            System.err.println("No user database available: " +
                               x.getMessage());
            Throwable cause = x.getCause();
            while ((cause != null) && ! (cause instanceof ClassNotFoundException))
            {
                System.err.println("\t" + cause);
                cause = cause.getCause();
            }
            System.err.println("Users will not be authenticated.");
        }

        startTime = System.currentTimeMillis();
        numberOfGamesStarted = 0;
        numberOfGamesFinished = 0;
        numberOfUsers = 0;
        serverRobotPinger = new ServerRobotPinger(robots);
        serverRobotPinger.setDaemon(true);
        serverRobotPinger.start();
        gameTimeoutChecker = new GameTimeoutChecker(this);
        gameTimeoutChecker.setDaemon(true);
        gameTimeoutChecker.start();
        this.databaseUserName = databaseUserName;
        this.databasePassword = databasePassword;

        /**
         * Print game options if we've set them on commandline, or if
         * any option defaults require a minimum client version.
         */
        if (hasSetGameOptions || (GameOption.optionsMinimumVersion(GameOption.getAllKnownOptions()) > -1))
        {
            Thread.yield();  // wait for other output to appear first
            try { Thread.sleep(200); } catch (InterruptedException ie) {}

            printGameOptions();
        }
    }