2017-07-04 7 views
1

複数のタイプのアクションをサポートするクライアントソケットとサーバーソケットの間で通信する最善の方法は何ですか?要するに

主な問題であり、オンラインゲームのために、サーバはクライアントがそのようなように、をしたいアクションの複数のタイプをサポートする必要があります「ゲームログインを」 、 "ゲームルームを作る" 、 "ゲームを起動する"、 "チャットメッセージを送信する"、 "部屋リストを取得する" ...

ソケットを使用する場合は、サーバーとクライアントの間で送受信される各メッセージからアクションの種類を区別する最も良い方法は何かを考えています。

これは私のオンラインゲームの展開は次のようになります。私が使用することを選択した場合

Communication

:、アクションの複数のタイプをサポートするための

Architecture

私の最初のアイデア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")) 
    .... 

そして、プログラムは非常にスケーラブルかつunmaintainableすることができます。

Server/Clientソケット間で複数のタイプのアクションをサポートするためのより良い方法について、ご意見をお聞かせください。

ありがとうございました。

+1

美しい犬と良い策定質問:) – davidxxx

答えて

1

しかし、問題が発生し、私のような "IF-ELSE" の記述がたくさんあります:あなたはJSONオブジェクトを受け入れprocess()方法でProcessingインタフェースを定義することができます

を(たとえば、javax.json.JsonObject)。
各アクションは、このインターフェイスを実装しています。
このようにして、各Stringアクションに関連付けられたActionサブクラスを格納するMap<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); 
+0

をおかげで、このコマンドを使用したとき、私の最初の考えを具体化パターン。 –

+0

確かに。どういたしまして。まだ一度、優れたあなたの犬の絵:) – davidxxx

関連する問題