Comunicazione TCP tra Silverlight e WPF

di Cristian Civera, in Silverlight,

Negli ultimi giorni mi sono incuriosito su come risolvere un'esigenza che potrebbe capitarmi in futuro: la comunicazione tra Silverlight e una application WPF/WinForms.
Silverlight ha potenzialità limitate e potrebbe utile usare un'applicazione classica locale che non ha limiti in termini di funzionalità.

Per questo scopo in Silverlight fortunatamente hanno lasciato la classe Socket che, sebbene il suo utilizzo differisce dal .NET Framework, permette di connettersi ad un end point e dialogare direttamente con i bytes, permettendo ampio margine di movimento e consentendo di implementare protocolli standard o custom.

Con questo post non è mio intento spiegare in dettaglio come si usa il socket, ma illustrare come vedo io una possibile implementazione e una collaborazione tra un'applicazione locale e una in Silverlight. Innanzitutto bisogna tenere conto che Silverlight può connettersi solo al range di porte 4502-4534, per ovvi motivi di sicurezza: evitare che un'applicazione possa essere strumento di attacchi DoS o Reverse tunnel. Inoltre sia che ci si connetta al host di origine sia ad un host esterno (cross site), è necessario che il server sia in ascolto anche sulla porta 943 (fissa) che su richiesta deve restituire il file clientAccessPolicy.xml che già conosciamo per le richieste HTTP, ma che viene validato anche per le richieste socket.
A questo indirizzo troviamo un esempio di classe PolicyServer per implementare questa logica di validazione, qualora un client Silverlight la richieda.

Con l'esempio indicato possiamo anche vedere come con il pattern Begin/End possiamo accettare nuove connessioni, inviare e ricevere bytes e creare di fatto un nostro protocollo di dialogo. Infatti l'idea è che una volta avviata l'applicazione Silverlight, qualora serva, facciamo partire quella locale che si mette in ascolto e con la quale poi si instaura un dialogo per chiedere informazioni al server o viceversa.

Per far partire il server viene in aiuto ClickOnce che grazie al sua capacità di installare un'applicazione al volo, la fa anche avviare. Basta navigare aprendo una popup al file .application e l'applicazione viene installata, previa conferma, e poi avviata.

private void StartButton_Click(object sender, RoutedEventArgs e)
{
    // Avvio l'applicazione con ClickOnce
    Uri appUri = new Uri("http://test.aspitalia.com:50658/setup/WebCamStreaming.application");
    HtmlPage.PopupWindow(appUri, "_blank", new HtmlPopupWindowOptions());

    // Avvia la comunicazione TCP
    client.ConnectAsync();
}

Attraverso poi un Mutex si può impedire che più istanze partano, lasciando sempre un solo server attivo. Qualora poi non serva più, possiamo sfruttare sempre la connessione tcp per inviare un segnale di chiusura dell'applicazione.

Nel prossimo post mostrerò un esempio completo di tutto questo ambaradam di cui darò i sorgenti.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese