客户端套接字和服务器套接字之间进行通信的最佳方式是什么,它支持多种类型的操作?

时间:2017-07-04 17:44:22

标签: java design-patterns client-server serversocket

简而言之:

主要问题是,对于在线游戏,服务器应支持客户想要执行的多种操作,例如:"登录游戏。" ,"创建一个游戏室。" ,"启动游戏。","发送聊天消息。","获取房间列表。" ...

但是,如果我要使用套接字,我想知道在服务器和服务器之间接收或发送的每条消息中区分行为类型的最佳方式是什么?客户端。

这就是我在线游戏的部署情况:

Architecture

为了支持多种类型的行动,我的第一个想法是:

Communication

如果我选择使用JSON,它可能看起来像:

{
    "action":"signIn",
    "data":{
        "id":"00001",
        "name":"waterball"
    }
}

然后服务器端可以通过解析JSON属性来区分操作。

但是出现问题,我会有很多" if-else" 描述如下:

if ( action.equals("signIn") )
    ....
else if ( action.equals("createRoom") )
    ....
else if ( action.equals("launchGame") )
    ....

该程序可能非常不可扩展且无法维护。

因此,请分享您关于在服务器/客户端套接字之间支持多种类型操作的更好方法的想法。

感谢。

2 个答案:

答案 0 :(得分:2)

  

但是出现问题,我会有很多“if-else”描述,如:

您可以使用Processing方法定义process()接口,该方法接受JSON对象(例如:javax.json.JsonObject)。
每个动作都实现了这个界面 通过这种方式,您可以使用Map<String, Action>来存储与每个String操作关联的Action子类。

例如初始化地图:

Map<String, Action> actionsByName = new HashMap<>();
actionsByName.put("signIn", new SignAction());
actionsByName.put("createRoom", new CreateRoomAction());

要处理用户操作:

   String actionName = ..;
   Action action = actionsByName.get(actionName);
   action.process(jsonObject);

答案 1 :(得分:0)

我认为使用JSON是您的消息传递是好的,但是,在处理多种类型的操作时,您可能对使用命令设计模式感兴趣。

https://www.tutorialspoint.com/design_pattern/command_pattern.htm