Я работаю на многопоточном сервере - клиентской программе, в которой клиенты подключаются к серверу и могут играть в игру друг против друга. Мне бы хотелось, чтобы на сервере было несколько объектов, таких как игроки, доски (в будущем), игровые объекты и т. Д. 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();
}
}
}