Come posso scrivere una struttura di messaggistica flessibile per l'invio di messaggi TCP a client e server

4

La domanda generale: come posso scrivere una struttura di messaggistica flessibile, ma non di proprietà, per inviare messaggi TCP a client e server?

Esempio:

Ho un server TCP per un gioco che invia alcuni messaggi tramite socket TCP ai client:

  1. Messaggi di chat, inclusi testo di chat, chat room e altoparlante.

  2. Messaggi di gioco, comprese azioni ed eventi

  3. Messaggi client, inclusi i client che si connettono, si collegano e si disconnettono

Per raggiungere questo obiettivo, quando una di queste azioni si verifica all'interno del programma, viene chiamato un gestore di eventi che genera un determinato tipo di evento.

ChatEvent with ChatEventArgs
GameEvent with GameEventArgs
ClientEvent with ClientEventArgs

Tutti estendono la classe EventArgs .

Ora alla mia domanda. Man mano che le cose diventano più complesse, comincio a racchiudere più informazioni in questi EventArgs . My GameEventArgs inizia come

GameEventArgs gameArgs = new GameEventArgs(GameAction.Start);
gameArgs.gameId = "gameId123";
gameArgs.turn = "thisPlayersTurn";
JSON json = GameEventArgs.ToJson(gameArgs);
SendMessageToClient(json);

Da questo puoi capire che GameEventArgs ha alcune proprietà pubbliche come gameId e turn . Ma un gioco è più che ID e Turni. Il cliente dovrà ricevere azioni di gioco, che possono essere molto complesse. All'improvviso GameEventArgs ha bisogno di sempre più proprietà. Questo va bene, tranne , che solo alcune di queste proprietà saranno inviate alla volta. Potrebbero esserci 20-40 proprietà inutilizzate di GameEventArgs. Dovrei creare più classi che ereditano GameEventArgs e contengono solo determinate proprietà? Invierò spesso messaggi e desidero prendere in considerazione il GC poiché questi messaggi sono utilizzati una sola volta. (Dovrebbero quindi essere IDisposable?).

Esiste un metodo migliore per la creazione di una struttura di messaggistica, in cui verranno utilizzate solo alcune delle proprietà definite del messaggio in una sola volta?

    
posta user2410532 20.09.2015 - 00:56
fonte

2 risposte

1

Questo problema è stato risolto in modo molto elegante da Google, nel progetto relativo ai buffer dei protocolli. Ha alcuni problemi che devi essere constrongvole. È un formato binario. Il mittente e il destinatario devono concordare il tipo di messaggio trasferito (ma non la versione del tipo di messaggio) e l'ultima volta che ho controllato le implementazioni C # non erano implementazioni di Google (o seguivano il loro stile API).

Tuttavia, il vantaggio di avere un formato di messaggio leggero (entrambi i byte e CPU), che si adatta bene ai client / server di sincronizzazione delle versioni e ha molte funzionalità di default per le specifiche dei messaggi, è un premio per me. / p>     

risposta data 19.11.2015 - 18:56
fonte
0

Nella tua situazione non userei l'ereditarietà, tranne forse una piccola quantità di tipi, dove ogni tipo contiene un insieme di proprietà che vengono solitamente utilizzate insieme.
Suggerisco di utilizzare un singolo ID per codificare il tipo di dati. Preferisco un Enum per questo (la sintassi è C ++. Net):

enum class EnumMessage
{
  MASK_Group = 1000000,
  Group_Chat   = 1000000,
  Group_Game   = 2000000,
  Group_Client = 3000000,
  ...
  Game_GameID = Group_Game + 1,
  Game_Turn   = Group_Game + 2,
  ...
};

Dato un ID, puoi scoprire il gruppo dividendo per MASK_Group.

Soluzione alternativa:
Un Enum per classe (GameEventArgs, ...), che codifica i tipi di dati.

Il messaggio stesso sarebbe costituito da più coppie di ID e dati effettivi, ad esempio
ID = 1 data="contenuto" ID = 2 ...
Se i dati potrebbero contenere il "carattere, lo ometterei e aggiungerei invece un'informazione di lunghezza, che in ogni caso è più sicura.
Sulla base dell'esistenza di un ID nel messaggio ricevuto, sai quali dati ottieni. Per decidere quali dati devi inviare, creerei elenchi statici, che contengono gli ID dei dati che desideri inviare.

    
risposta data 20.09.2015 - 18:19
fonte

Leggi altre domande sui tag