DaniWeb IT Discussion Community

DaniWeb IT Discussion Community (http://www.daniweb.com/forums/index.php)
-   Java (http://www.daniweb.com/forums/forum9.html)
-   -   multi-client server [problem with code - please have a look] (http://www.daniweb.com/forums/thread113808.html)

eleonora Mar 13th, 2008 6:50 pm
multi-client server [problem with code - please have a look]
 
Hello,

I urgently need help, im trying to complete a class which will be able of multiple - clients but is not doing the required puprose. Can anyone be assistance of what is needed to add for handling the clients ??

Thanks in advance!!
import java.util.ArrayList;
import java.util.concurrent.Semaphore;

class LODServer
{
    ServerBase<ClientHandler> server = null;

    /*
    ** Once the given number of players has connected,
    ** the instance of ServerBase<ClientHandler> returns
    ** an array of them.
    */
    ArrayList<ClientHandler> clients = null;

    /*
    ** This is the data that encodes the state of the game.
    ** The labyrinth is stored in a 2D array with
    ** numbers corresponding to the contents of each location.
    */
    static final int TREASURE    = 1;
    /* Larger positive numbers are several lots of treasure */
    static final int EMPTY        = 0;
    static final int HEALTH      = -1;
    static final int LANTERN      = -2;
    static final int SWORD        = -3;
    static final int ARMOUR      = -4;
    static final int EXIT        = -5;
    static final int WALL        = -6;

    int mapWidth = 5;
    int mapHeight = 5;
    int map[/*mapHeight*/][/*mapWidth*/] =
    {
        {WALL,    WALL,    ARMOUR,  WALL,    WALL    },
        {WALL,    EXIT,    EMPTY,  TREASURE, TREASURE},
        {LANTERN, TREASURE, EMPTY,  HEALTH,  LANTERN },
        {WALL,    SWORD,    EMPTY,  ARMOUR,  TREASURE},
        {WALL,    WALL,    SWORD,  WALL,    WALL    }
    };

    boolean gameStarted = false;
    boolean gameFinished = false;
    int goal = 2;          // The amount of treasure to collect

    /*
    ** The server has to be able to wait until the end of the player's turn.
    ** It uses a semaphore to do this.
    ** The player acquires the semaphore at the start of the turn
    ** and releases it at the end of the turn.
    ** This allows the server to wait until the end of the player's turn by
    ** simply waiting for the semaphore to be released.
    */
    Semaphore playerTurn = new Semaphore(1);
       

    public void setup (int port, int players, String map) {
        // Limit to one player
        if (players > 1) {
            System.err.println("The current implementation is limited to one player.");
            players = 1;
        }

        // Create the object to handle the incoming connections
        // ( you don't have to understand how this works )
        // If the last arguement is true then all incoming and outgoing messages
        // to the instances of ClientHandler will be logged.
        // Set to false if you don't want this.
        server = new ServerBase<ClientHandler>(ClientHandler.class, players, port, true);



        // Any set up for the game that can be done
        // before the clients connect goes here...

        // Map name is currently ignored
        System.err.println("Map loading is not implemented, \"" + map + "\" ignored.");



        // Start accepting incoming connections.
        System.out.print("Waiting for players to connect ... ");
        server.start();
    }

    public void play () throws InterruptedException {

        // Wait for all of the clients to connect
        clients = server.getConnections();
        System.out.println(" done.");

        // Any set up for the game that is specific
        // to the clients goes here.


        // Give each ClientHandler a reference to this object
        // and thus access to the game data
        for (ClientHandler c : clients) {
            c.server = this;
        }

        // Fix the player's starting location
        clients.get(0).x = 2;
        clients.get(0).y = 2;

        // Let each client know the amount of treasure it needs
        for (ClientHandler c : clients) {
            c.serverGoal(goal);
        }

        // Play the game!
        System.out.println("Starting the game.");
        gameStarted = true;
        while (gameFinished == false) {

            // Check that there is at least one player connected
            if (clients.size() <= 0) {
                System.out.println("Game abandoned");
                break;
            }

            // Each player takes a turn
            //for (ClientHandler c : clients) {
            ClientHandler c = clients.get(0);

            // Start turn
            System.out.println("Starting the turn of player \"" + c.name + "\"");
            c.startTurn();    // During this, c will acquire() the playerTurn semaphore

            // Wait for the player to finish their turn
            // (they will release() the semaphore at the end of their turn)
            try {
                playerTurn.acquire();
            } catch (InterruptedException e) {
                // This shouldn't happen in normal operation
                // If it happens, it is because this code
                // has been used in a larger bit of software
                // thus the wrapper can deal with this condition
                throw(e);
            }
            System.out.println("End of turn");

            // Check to see if the current player has won
            // (gameFinished is set to true in ClientHandler.clientEndTurn())
            if (gameFinished == true) {

                System.out.println("Game over, \"" + c.name + "\" is the winner");

                // Tell the player they have won
                c.serverMessage("Congratulations " + c.name + " you won!");
                c.serverWin();

                // Tell everyone else that they haven't
                for (ClientHandler d : clients) {

                    if (d != c) {
                        d.serverMessage("Sorry " + d.name + " it looks like " + c.name + " beat you.");
                        d.serverLose();
                    }

                }

            }

            // Release the semaphore so that the next player can start their turn
            playerTurn.release();
            //}


        }
           
        return;

    }

    // A simple helper function
    public static void printUsageAndDie(String error) {
        System.err.println(error);
        System.err.println("Usage:");
        System.err.println("\tjava LODServer <port> <players> <map>");
        System.exit(1);
    }

    // The main method just handles the command line arguements
    // creates one instance of LODServer and starts it running
    public static void main(String args[])
    {

        // Check the command line arguements
        if (args.length != 3) {
            printUsageAndDie("Incorrect number of command line arguements");
        } else {
            // Parse the command line arguements
            int port = Integer.parseInt(args[0]);

            // Only ports 1025 to 65535 are suitable
            if ((port <= 1024) || (port >= 65536)) {
                printUsageAndDie("Invalid port number");
            }

            int players = Integer.parseInt(args[1]);
            if (players < 0) {
                printUsageAndDie("Invalid number of users");
            }

            // Create a LODServer object to run the game
            LODServer s = new LODServer();

            // Set it up
            s.setup(port,players,args[2]);
       
            // Go!
            try {
                s.play();
            } catch (InterruptedException e) {
                // Something has gone wrong - abort
                System.err.println("Caught InterruptedException(?)");
                System.exit(1);
            }
        }
    }
}

mzaiady Mar 14th, 2008 8:58 am
Re: multi-client server [problem with code - please have a look]
 
What is the proplem exact you are facing, and also i noticed you are commenting the part in the code that loops over the clients to give each players his turn

// Each player takes a turn
//for (ClientHandler c : clients) {
ClientHandler c = clients.get(0);


All times are GMT -4. The time now is 7:19 pm.

Forum system based on vBulletin Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
©2003 - 2009 DaniWeb® LLC