如何在WebSocket会话之间共享对象

时间:2018-09-30 08:02:38

标签: java websocket

目前,我正在基于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类的静态成员,但这是一种好习惯吗?

亲切的问候!

0 个答案:

没有答案