Progettazione del server: come deve comunicare il server con il resto del programma?

1

Ho cercato di imparare come gestire l'input di rete in C ++ (usando asio per il networking). In questo momento sto provando a costruire un programma che dovrebbe essere in grado di ricevere comandi e dati da un client attraverso la rete che dovrebbe gestire in modi diversi, ma sono bloccato quando si tratta di come questo possa essere fatto in una bella modo disaccoppiato.

Ad esempio, un semplice programma che riceverà immagini compresse attraverso una connessione TCP (o nel mio caso UDP, ma che non dovrebbe fare una grande differenza per la mia domanda) e renderle su uno schermo, potrebbe avere queste classi per Networking:

  • NetworkServer (ascolta e riceve connessioni su nuovi thread)
  • ConnectionManager (tiene traccia delle connessioni)
  • Connessione (gestisce una sessione)

E per decomprimere e visualizzare le immagini sullo schermo, queste classi:

  • Decompressore (gestisce la decompressione delle immagini)
  • Schermo (gestisce uno schermo, può prendere una bitmap non elaborata e visualizzarlo)

E poi abbiamo una classe Server che è stata avviata in main, e contiene lo schermo, il decompressore e il NetworkServer che avvia anch'esso.

Quindi diciamo che Connection inizia a ricevere un'immagine compressa a > 1mb che è stata separata in molti blocchi più piccoli (1kb ciascuno?) i cui dati devono essere inoltrati a un Decompressor, che a sua volta inoltrerà l'immagine completa alla schermata una volta l'immagine completa è stata decompressa.

Per questo scenario, come dovrebbero passare i dati dalla Connessione al Decompressore? Suppongo che sia una cattiva progettazione che ogni Connection gestisca un riferimento a un Decompressor (perché se vogliamo anche che il server controlli audio, video, una chat e si illumini attraverso le connessioni TCP, ogni connessione abbia riferimenti a tutti quelli ?).

Stavo pensando qualcosa sulla falsariga che la connessione spingesse i messaggi binari ricevuti in una coda e che un MessageDeliverer di classe separato in esecuzione su un thread diverso analizzasse i messaggi (in una classe chiamata ImageChunkMessage o così?) e li inoltrasse dove dovrebbero essere maneggiati. È una buona soluzione anche se i messaggi possono contenere un bel po 'di dati? Suppongo che sarebbe una buona pratica lasciare che il Decompressore "sottoscrivi" messaggi relativi ad esso (ancora una volta, se aggiungiamo audio, allora forse una classe che controlla la riproduzione / decompressione audio si iscriverebbe a "AudioChunkMessages"). Tuttavia, questo significherebbe che la classe Decompressor è in grado di gestire ImageChunkMessages e che non sembra un buon design? (Sarebbe più bello della parte del messaggio sarebbe analizzato da qualche altra parte, e il Compressore viene chiamato direttamente con i dati dal messaggio, ma dove dovrebbe succedere questo parsing?)

Spero che sia stato abbastanza comprensibile. Questo è solo un esempio che ho trovato durante la scrittura di questo post, quindi è ovviamente molto semplificato (e molto probabilmente ha molti difetti), ma spero che sia abbastanza buono da spiegare la domanda che ho.

Esistono buoni modi "standard" per gestirli che non sono specifici per linguaggio / framework? Sembra che ci dovrebbe essere un sacco di articoli che coprono questo, ma o sto cercando la cosa sbagliata o non c'è tanto quanto avrei pensato. Ho provato a guardare alcuni progetti open source, ma ci vorrebbero settimane per capire il loro flusso dal momento che sono abbastanza grandi.

    
posta André T. 04.08.2017 - 14:56
fonte

0 risposte

Leggi altre domande sui tag