Contrordine... Mi lascio un appunto qui, così l'anno nuovo so già a cosa dovrò lavorare .
Mi sto riferendo ai nuovi oggetti forniti dal .NET Framework 3.5 per la gestione di applicazioni Peer-to-Peer: in particolare, PeerName, PeerNameRegistration e PeerNameResolver, contenuti nel namespace System.Net.PeerToPeer. Grazie ad essi, realizzare applicazioni Peer-to-Peer è di una semplicità sconcertante. Ad esempio, il seguente codice pubblica un nuovo peer:
1 // Creates a secured PeerName.
2 PeerName peerName = new PeerName("MyPeerNode", PeerNameType.Secured);
3
4 PeerNameRegistration pnReg = new PeerNameRegistration(peerName, 4567, Cloud.Global);
5 pnReg.UseAutoEndPointSelection = true;
6 pnReg.Comment = "up to 39 unicode char comment";
7 pnReg.Data = Encoding.UTF8.GetBytes("A data blob up to 4K associated with the name");
8
9 //Starting the registration means the name is published for other peers to resolve.
10 pnReg.Start();
11
12 Console.WriteLine("Registration of Peer Name: {0} complete.", peerName.ToString());
13
14 Console.WriteLine("Press any key to stop the registration and close the program");
15 Console.ReadKey();
16
17 pnReg.Stop();
Il codice è abbastanza autoesplicativo. L'unica nota la merita l'istruzione 4, con cui si crea l'oggetto che si occupa di effettuare la registrazione vera e propria del peer: utilizzando il parametro Cluod.Global, si indica al sistema che il peer deve essere visibile globalmente (ovvero su tutta Internet).
Il discovery dei peer è altrettanto semplice:
1 // Create a resolver object to resolve a peername.
2 PeerNameResolver resolver = new PeerNameResolver();
3 PeerName peerName = new PeerName("MyPeerNode", PeerNameType.Secured);
4 // Resolve the PeerName - this is a network operation and will
5 // block until the resolve request is completed.
6 PeerNameRecordCollection results = resolver.Resolve(peerName, Cloud.Global);
7
8 // Show the data returned by the resolve operation.
9 Console.WriteLine("Records from resolution of PeerName: {0}", results.Count);
10 Console.WriteLine();
11 int count = 1;
12 foreach (PeerNameRecord record in results)
13 {
14 Console.WriteLine("Record #{0} results...", count);
15
16 Console.WriteLine("Comment:");
17 if (record.Comment != null)
18 Console.WriteLine(record.Comment);
19
20 Console.WriteLine("Data:");
21 if (record.Data != null)
22 Console.WriteLine(Encoding.UTF8.GetString(record.Data));
23
24 Console.WriteLine("Endpoints:");
25 foreach (IPEndPoint endpoint in record.EndPointCollection)
26 Console.WriteLine("\t Endpoint: {0}", endpoint.Address);
27
28 count++;
29 }
30
In questo caso, l'istruzione fondamentale è quella alla riga 6, con cui si effettua il discovery: anche stavolta, si utilizza Cloud.Global, indicando che si vuole fare una ricerca globale (altrimenti sarebbe limitata ai peer registrati nella propria sottorete). Nell'esempio, il discovery è effettuato in maniera sincrona, ma sono disponibili anche i metodi e gli eventi per realizzare il tutto in modo asincrono.
Naturalmente questo è solo il punto di partenza. Ci sarebbe molto da dire su come funziona il supporto al Peer-to-Peer in .NET, su cosa avviene "dietro le quinte" quando si registra un peer e quando si avvia il discovery... Ma di questo parleremo l'anno nuovo ... Adesso vi lascio veramente ai festeggiamenti... A presto, miei cari 25 lettori!
Technorati tags:
.NET,
Programming,
C#