Как хранить на сервере объекты, к которым могут обращаться все клиенты? - PullRequest
0 голосов
/ 29 марта 2020

Я работаю на многопоточном сервере - клиентской программе, в которой клиенты подключаются к серверу и могут играть в игру друг против друга. Мне бы хотелось, чтобы на сервере было несколько объектов, таких как игроки, доски (в будущем), игровые объекты и т. Д. c, и чтобы к ним обращались все клиенты.

Для этого Я дал классу Client объект Server, такой как Сервер server = new Server () .

Я знаю, что не должен этого делать, поскольку это создаст новый сервер для каждого подключенного клиента, но я не знаю, как это сделать иначе, какие-либо советы?

public class Server {

public ArrayList<ServerPlayer> players = new ArrayList<>();

public static void main(String args[]) throws IOException {

    ServerSocket ss = new ServerSocket(5656);

    while (true) {

        Socket s = null;

        try {
            // socket object to receive incoming client requests
            s = ss.accept();

            System.out.println("A new client is connected : " + s);

            // obtaining input and out streams
            DataInputStream dis = new DataInputStream(s.getInputStream());
            DataOutputStream dos = new DataOutputStream(s.getOutputStream());

            System.out.println("Assigning new thread for this client");

            // create a new thread object
            Thread t = new ClientHandler(s, dis, dos);

            // Invoking the start() method
            t.start();

        } catch (Exception e) {
            s.close();
            e.printStackTrace();
        }
    }
}

public void addToList(ServerPlayer player) {
    players.add(player);
}

public ArrayList<ServerPlayer> getPlayerList() {
    return players;
}

}

class ClientHandler extends Thread {
    DateFormat fordate = new SimpleDateFormat("yyyy/MM/dd");
    DateFormat fortime = new SimpleDateFormat("hh:mm:ss");
    final DataInputStream dis;
    final DataOutputStream dos;
    final Socket s;
    private Server server = new Server();

// Constructor
public ClientHandler(Socket s, DataInputStream dis, DataOutputStream dos) {
    this.s = s;
    this.dis = dis;
    this.dos = dos;
}

@Override
public void run() {

    String received;
    String toreturn;
    while (true) {
        try {

            // Ask user what he wants
            dos.writeUTF("What do you want?[Date | Time]..\n" + "Type Exit to terminate connection.");

            // receive the answer from client

            received = dis.readUTF();

            if (received.equals("Exit")) {
                System.out.println("Client " + this.s + " sends exit...");
                System.out.println("Closing this connection.");
                this.s.close();
                System.out.println("Connection closed");
                break;
            }

            if (received.contains(";")) {
                String[] handle = received.split(";");

                switch (handle[0]) {

                case "c":
                    String playername = handle[1];
                    String teamname = handle[2];
                    ServerPlayer player = new ServerPlayer(playername, teamname);
                    server.addToList(player);
                    dos.writeUTF(playername + " " + teamname + " " + "created!");
                    break;

                default:
                    dos.writeUTF("Invalid input");
                    break;

                }

            } else {

                // creating Date object
                Date date = new Date();

                // write on output stream based on the
                // answer from the client
                switch (received) {

                case "Date":
                    toreturn = fordate.format(date);
                    dos.writeUTF(toreturn);
                    break;

                case "Time":
                    toreturn = fortime.format(date);
                    dos.writeUTF(toreturn);
                    break;
                case "players":
                    for (ServerPlayer player : server.players) {
                        dos.writeUTF(player.getName());
                    }
                    break;

                default:
                    dos.writeUTF("Invalid input");
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    try {
        // closing resources
        this.dis.close();
        this.dos.close();

    } catch (IOException e) {
        e.printStackTrace();
    }

}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...