目前,我正在基于Websocket的游戏服务器上工作。这个想法是用户可以去:
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
类的静态成员,但这是一种好习惯吗?
亲切的问候!