В настоящее время я работаю над игровым сервером на основе веб-сокета.Идея состоит в том, что пользователь может перейти к:
ws://host:port/game/{userid}
Таким образом, пользователь регистрируется на сервере.Оттуда на сервере есть объект GameManager, который назначает игрока открытой игре.Если открытой игры не существует, создается новая игра.Вот как выглядит моя конечная точка сервера:
package websocket;
import java.io.IOException;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import model.Player;
@ServerEndpoint("/game/{userid}")
public class GameWebSocketServer {
private GameManager gameManager = new GameManager();
public GameWebSocketServer() {
}
@OnOpen
public void onOpen( Session session,
@PathParam("userid") String userid) {
Player player = new Player(userid, session);
gameManager.addPlayerToOpenGame(player);
}
@OnClose
public void onClose(Session session) {
}
@OnMessage
public void onMessage(String message, Session session) {
}
@OnError
public void onError(Throwable t) {
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что объект GameManager
, похоже, не является общим для каждого игрока / сеанса на моем сервере.Каждый раз, когда новый игрок регистрирует новый экземпляр класса GameManager
, создается.Это приводит к тому, что каждый экземпляр GameManager
создает другую игру, и поэтому все игроки попадают в отдельные игры.
Во-первых, правильно ли мое понимание проблемы?Каждый игрок подключается, значит, создается новый экземпляр сервера (а также GameManager
)?
Во-вторых, есть ли хороший способ решить эту проблему?Я думаю, что мог бы сделать GameManager
статическим членом класса GameWebSocketServer
, но разве это хорошая практика?
С уважением!