Domanda

Sto cercando di costruire un'applicazione Cocoa su Mac con un processo demone di back-end (in realtà solo una per lo più senza testa cacao app, probabilmente), insieme a 0 o più applicazioni "client" in esecuzione a livello locale (anche se, se possibile mi piacerebbe supportare client remoti pure;. i client remoti sarebbero sempre e solo essere altri Mac o dispositivi iPhone OS)

I dati che vengono comunicati saranno abbastanza banale, per lo più solo testi e comandi (che presumo che può essere rappresentato come testo in ogni caso), e forse il piccolo file occasionale (un'immagine forse).

Ho guardato un paio di metodi per fare questo, ma non sono sicuro che è "migliore" per il compito a portata di mano. Cose che ho considerato:

  • Leggere e scrivere in un file (... sì), molto semplice, ma non è molto scalabile.
  • prese Pure (non ho alcuna esperienza con gli zoccoli, ma mi sembrano pensare che io possa usare per inviare i dati a livello locale e su una rete. Anche se sembra ingombrante se facendo tutto a Cocoa
  • oggetti distribuiti: sembra piuttosto poco elegante per un compito come questo
  • NSConnection: Non posso davvero capire che cosa questa classe fa anche, ma ho letto di esso in alcuni risultati della ricerca IPC

Sono sicuro che ci sono cose che mi manca, ma sono rimasto sorpreso di trovare una mancanza di risorse su questo argomento.

È stato utile?

Soluzione

Attualmente sto esaminando le stesse domande. Per me la possibilità di aggiungere i client Windows in seguito rende la situazione più complicata; nel tuo caso la risposta sembra essere più semplice.

Informazioni sulle opzioni si hanno considerato:

  1. File di controllo: mentre è possibile comunicare tramite file di controllo, è necessario tenere a mente che i file devono essere comunicati tramite un file system di rete tra le macchine coinvolte. Quindi il file system di rete serve come un'astrazione delle infrastrutture di rete attuale, ma non offre tutta la potenza e la flessibilità della rete ha normalmente. Implementazione: In pratica, si avrà bisogno di avere almeno due file per ogni coppia di client / server: un file utilizzata dal server per inviare una richiesta al client (s) e un file per le risposte. Se ogni processo in grado di comunicare in entrambe le direzioni, è necessario duplicare questo. Inoltre, sia il client (s) e il server di lavoro (s) su base "pull", vale a dire, hanno bisogno di rivedere i file di controllo frequente e vedere se qualcosa di nuovo è stato consegnato.

    Il vantaggio di questa soluzione è che riduce al minimo la necessità di imparare nuove tecniche. Il grande svantaggio è che ha enormi richieste sulla logica del programma; un sacco di cose devono essere presi cura di voi (Saranno i file scritti in un unico pezzo o può accadere che eventuali scelte di partito fino file incoerenti? Con quale frequenza dovrebbero controlli attuati? Ho bisogno di preoccuparsi del file system, come il caching, ecc? Posso crittografia aggiuntivo più tardi senza giocherellare con le cose al di fuori del mio codice di programma? ...)

    Se la portabilità è stato un problema (che, per quanto ho capito dalla tua domanda non è il caso), allora questa soluzione sarebbe facile porta per diversi sistemi e anche diversi linguaggi di programmazione. Tuttavia, non so di qualsiasi rete file istema per iPhone OS, ma non sono familiarità con questo.

  2. Zoccoli: L'interfaccia di programmazione è certamente diversa; seconda della vostra esperienza con la programmazione presa può significare che si hanno più lavoro di apprendimento per primo e il debug in un secondo momento. Attuazione : In pratica, avrete bisogno di una logica simile come prima, vale a dire, client (s) e il server (s) comunicare attraverso la rete. Un vantaggio decisivo di questo approccio è che i processi possono lavorare su una base "push", vale a dire, si può ascoltare su un socket fino a quando arriva un messaggio che è superiore a controllare i file di controllo regolarmente. la corruzione e le incoerenze di rete non sono la vostra preoccupazione. Inoltre, è (può) avere un maggiore controllo sul modo in cui le connessioni sono stabilite, piuttosto che basarsi su cose al di fuori del controllo del vostro programma (ancora una volta, questo è importante, se si decide di aggiungere la crittografia in seguito).

    Il vantaggio è che un sacco di cose sono prese dalle spalle che preoccupa un'implementazione a 1. Lo svantaggio è che hai ancora bisogno di cambiare la vostra logica di programma sostanzialmente al fine di fare in modo che si inviano e ricevono le informazioni corrette (tipi di file, ecc.).

    Nella mia esperienza la portabilità (vale a dire, la facilità di transizione a sistemi diversi e anche i linguaggi di programmazione) è molto buona dal momento che nulla neanche lontanamente compatibile con POSIX funziona.

    [ Modifica In particolare, non appena si comunica numeri binari endianess diventa un problema e si deve prendere cura di questo problema manualmente - si tratta di un comune caso particolare del "(!) informazioni corrette problema" che ho citato sopra. Esso ti morderà per esempio quando si ha un PowerPC a parlare con un Mac Intel. Questo caso particolare scompare con la soluzione 3. + 4. insieme saranno tutti gli altri temi "corretta informazione".]

  3. 4. oggetti distribuiti: Il cluster di classe NSProxy viene utilizzato per implementare oggetti distribuiti. NSConnection è responsabile per la creazione connessioni remote come prerequisito per l'invio informazione in giro, quindi una volta capito come utilizzare questo sistema, si capisce anche oggetti distribuiti. ; ^)

    L'idea è che la logica di programma di alto livello non ha bisogno di essere cambiato (per esempio, gli oggetti comunicano tramite messaggi e ricevere i risultati ei messaggi insieme con i tipi restituiti sono identici a quello che siete abituati a dalla tua implementazione locale ), senza dover preoccuparsi circa i particolari della infrastruttura di rete. Beh, almeno in teoria. Implementazione: Sto anche lavorando su questo proprio ora, quindi la mia comprensione è ancora limitata. Per quanto ho capito, si ha bisogno di impostare una certa struttura, vale a dire, si deve ancora decidere quali processi (locale e / o remoto) in grado di ricevere messaggi che; questo è ciò che fa NSConnection. A questo punto, è implicitamente definire un'architettura client / server, ma non c'è bisogno di preoccuparsi per i problemi menzionati in 2.

    C'è un'introduzione con due esempi espliciti al server del progetto GNUstep; illustra come funziona la tecnologia ed è un buon punto di partenza per la sperimentazione: http://www.gnustep.org/resources/documentation/ Developer / Base / ProgrammingManual / manual_7.html

    Purtroppo, gli svantaggi sono una perdita totale di compatibilità (anche se si continua a fare bene con la messa a punto lei ha citato di Mac e iPhone / iPad solo) con altri sistemi e la perdita di portabilità verso altre lingue. Gnustep con Objective-C è nel migliore dei casi il codice-compatibile, ma non c'è modo di comunicare tra GNUstep e Cocoa, vedere la mia modifica alla domanda numero 2 qui: CORBA su Mac OS x (cacao)

    [ Modifica Ho appena imbattuto in un altro pezzo di informazione che non conoscevo. Mentre ho controllato che NSProxy è disponibile su iPhone, non ho controllato se le altre parti del meccanismo oggetti distribuiti sono. Secondo questo link: http://www.cocoabuilder.com/archive/cocoa/224358-big-picture-relationships-between-nsconnection-nsinputstream-nsoutputstream-etc.html (cercare la pagina per la frase "iPhone OS") non sono. Questo escluderebbe questa soluzione se si domanda di utilizzare iPhone / iPad in questo momento.]

Quindi, per concludere, c'è un trade-off tra sforzo di apprendimento (e l'attuazione e il debug) nuove tecnologie sulla mano uno e la codifica a mano logica di comunicazione di livello inferiore, dall'altro. Mentre l'approccio a oggetti distribuiti prende la maggior parte del carico delle spalle e comporta i più piccoli cambiamenti nella logica di programma, è la più difficile da imparare e anche (purtroppo) la meno portatile.

Altri suggerimenti

Disclaimer: Distributed Objects sono non disponibile su iPhone .


Perché si fa a trovare oggetti distribuiti inelegante? Si suona come una buona partita qui:

  • smistamento trasparente di tipi fondamentali e classi Objective-C
  • che non importa wether clienti sono locali o remote
  • non molto lavoro aggiuntivo per le applicazioni Cocoa-based

La documentazione potrebbe rendere il suono come più lavoro allora in realtà è, ma tutto quello che dovete fare è sostanzialmente quella di utilizzare i protocolli in modo pulito e di esportazione, o rispettivamente di connettersi, l'oggetto server di root.
Il resto dovrebbe accadere automagicamente dietro le quinte per voi nello scenario dato.

Stiamo usando ThoMoNetworking e funziona bene ed è veloce da installare. In sostanza si permette di inviare NSCoding oggetti compliant nella rete locale, ma ovviamente funziona anche se il client e il server sono in poi stessa macchina. Come un wrapper per le classi di fondazione si occupa di accoppiamento, riconnessioni, etc ..

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top