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

标签 java design-patterns client-server serversocket

简而言之:

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

但是如果我要使用Socket,我想知道从服务器和客户端之间接收或发送的每条消息中区分操作类型的最佳方法是什么。

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

Architecture

为了支持多种类型的操作,我的第一个想法:

Communication

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

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

然后Server端可以通过解析JSON属性来区分出 Action 。

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

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

而且该程序可能非常不可扩展且难以维护。

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

谢谢。

最佳答案

But a problem occurs, I will have lots of "if-else" descriptions like:

您可以定义Processingprocess() 的接口(interface)接受 JSON 对象的方法(例如: javax.json.JsonObject )。
每个 Action 都实现这个接口(interface)。
这样你就可以使用 Map<String, Action>它存储与每个字符串操作关联的操作子类。

例如初始化 map :

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);

关于java - 支持多种类型操作的客户端套接字和服务器套接字之间通信的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44911653/

相关文章:

java - 在 Intellij IDEA 12 中使用 SVN 1.4.6

java - 用于在 Java 学生关系表上支持不同过滤器集的设计模式

c++ - ZMQ - 客户端服务器 : Client is powered off unexpectedly, 服务器如何检测到它?

apache-flex - DDD 和客户端/服务器应用程序

java - 使用 ANT 任务时将文件传递到 antfile

java - 从 HashMap<String, HashSet<Integer>> 获取随机值

java - Spring 验证注释 - 如何验证字符串中的 2 个字符条目是否是实际的美国州?

ruby - 最佳实践 : Creating a module with expectation of type its included in?

Javascript 记录错误

Java简单的客户端服务器程序