\\ Home : Articoli : Stampa
Inviare un file con remoting
Di RobyDx (del 18/01/2007 @ 21:39:09, in DotNet, linkato 2275 volte)

Può capitare di avere la necessità di dover controllare un computer a distanza per molti motivi, dall'invio di file all' esecuzioni di programmi. Esistono già molti programmi che permettono un controllo pressochè totale del computer (esempio VNC). Oggi vi spiego come poter creare in modo semplice un software in grado di far comunicare 2 computer tra di loro tramite il namespace Remoting.

Il namespace contiene diverse funzionalità atte a semplificare questo processo che di solito è abbastanza lungo e noioso tramite il classico socket. Il remoting infatti permette di fare una cosa molto interessante:

istanziare una classe su un computer ed utilizzarla da altre macchine. Una sorta di istanza di rete.

A parte alcune limitazioni dovute alla sicurezza sembrerà di utilizzare una normale classe creata dal nostro programma mentre in realtà i risultati di tali operazioni saranno condivise tra il server che contiene l'istanza della classe ed i vari client ad essa connessa.

In questo esempio mostrerò un esempio di remoting creando un software che invia da un client un file ad un server.

I namespace necessari per creare l'applicazione sono questi

using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

Per prima cosa si deve creare una classe che permetta il remoting

public class RemoteClass : MarshalByRefObject
{
}

Una classe che estende la classe base MarshalByRefObject è automaticamente pronta ad essere istanziata in rete. All'interno funziona come una normalissima classe. La stessa identica classe dovrà essere presente sia nell'applicazione che farà da server, sia in quella che fa da client mantenendo uguale sia il codice che il namespace. Ora istanziamo la classe nell'applicazione che farà da server e mettiamola in rete.

RemoteClass conn = new RemoteClass();
IChannel channel = new TcpServerChannel(8080);
ChannelServices.RegisterChannel(channel, false);
RemotingServices.Marshal(conn, "RemoteSample");

si crea un canale di comunicazione di tipo server passandogli una porta (nell'esempio 8080), lo si registra in modo che sia assegnato alla nostra applicazione e con l'istruzione Marshal si invia la classe in rete (assegnandogli un nome). Il server è finito. La classe può essere ora utilizzata anche da applicazioni client che si connetteranno a lei. Ora istanziamo la classe in un secondo software che farà da client.

IChannel channel = new TcpClientChannel();
ChannelServices.RegisterChannel(channel, false);
RemoteClass conn = (RemoteClass)Activator.GetObject(typeof(RemoteClass), "tcp://localhost:8080/RemoteSample");

Creiamo il canale, lo registriamo ed attiviamo classe con la classe Activator (passandogli il tipo di classe che ricordo, dovrà essere perfettamente uguale a quella sul server, e l'indirizzo comprensivo del nome dato all'istanza nell'applicazione server). Anche qui abbiamo finito, ora la classe RemoteClass è connessa alla classe istanziata dal server. Se eseguiamo un metodo sull'oggetto i risultati saranno condivisi tra tutte le applicazioni collegate. Se per esempio creiamo un metodo "SendFile" in cui passiamo un file come array di byte ed un metodo GetFile che va a leggere questi byte dalla classe avremo la possibilità di scambiare file tra computer diversi. Ricordate che comunque la classe gira sul server e vi impedirà di andare a fare manovre sul computer client, come vi impedirà di far fare al client operazioni non previste nella classe RemoteClass. Però è possibile mandare un input alla classe RemoteClass affinchè sia lei a fare una operazione (esempio spengere il vostro pc a distanza o avviare una registrazione).

Per rilasciare la connessione è sufficiente usare

ChannelServices.UnregisterChannel(channel);

In questo modo il canale sarà libero.

Vi lascio un semplicissimo programma che permette ad un client di mandare un file che il server salverà sul proprio disco.

ps E' un programma di rete quindi il firewall andrà impostato per permettere al programma di girare.

Esempio