Nella seconda parte dell'articolo "Giocando con l'interoperabilità", qui la prima, illustrerò le componenti "ReporterDashborad" e "BroadCastingStudio".
ReporterDashborad
Il ReportDashbord è l'applicazione che interoperando con il web service (Editorial Service) accoderà le notizie che dovranno essere divulgate. Qui posterò il codice del Program (la classe del main). E' sottointeso che nel progetto, console application), verranno incluse le strutture di codice generate dall'xsd qui descritto e le classi generate referenziando EditorialService ("Add web reference" bla bla bla... -> ReporterDashboard.InteropGameChannel.EditorialService & Co.). Se non avete mai aggiunto una referenza ad un webservice - e quindi il "bla bla bla" di riempimento è per voi ignoto - potete dare un occhio qui.
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using ReporterDashboard.InteropGameChannel;
namespace ReporterDashboard
{
class Program
{
[STAThread]
static void Main(string[] args)
{
try
{
while(true)
{
Console.Write("Type message: ");
string text = Console.ReadLine();
if(text == string.Empty) break;
// creo un messaggio
message message = new message();
message.text = text;
// aggiungo l'applicativo come il primo nella lista del tracking...
messageTrackingStage trackingStage = new messageTrackingStage();
trackingStage.date = DateTime.Now;
trackingStage.Value = AppDomain.CurrentDomain.FriendlyName;
message.tracking = new messageTrackingStage[]{trackingStage};
// serializzo messaggio
MemoryStream mem = new MemoryStream();
XmlSerializer ser = new XmlSerializer(typeof(message));
ser.Serialize(mem, message);
// recupero xmlElement del messaggio e spedisco a servizio web
mem.Position = 0;
XmlDocument doc = new XmlDocument();
doc.Load(mem);
//preparo proxy del servzio con header di authentiazione e invoco metodo per
//l'accodamento della notizia...
EditorialService editorialService = new EditorialService();
AuthenticationHeader authentication = new AuthenticationHeader();
authentication.username = "markino";
authentication.password = "password";
editorialService.AuthenticationHeaderValue = authentication;
editorialService.EnqueueNews(doc.DocumentElement);
// messaggio è stato correttamente ricevuto dal servizio web
Console.WriteLine("Message sent successfully.");
}
}
catch(Exception e)
{
//stampo errore a video
Console.WriteLine(e);
Console.ReadLine();
}
}
}
}
BroadcastingStudio
Broadcasting studio è invece la componente che riceve i messaggi accodati sulla coda MQ dall'EditorialService e li divulgherà in broadcast. Anche in questo progetto è implicito che verranno inclusi i file generati analizzando l'xsd del messaggio, qui descritto. Per la natura del programma sarebbe interssante implementarlo come servizio windows... e solo per praticità/semplicità ho scelto di dare lui la forma di Console Application.
A supporto implemento una classe per fare il broadcast dei messaggi.
using System;
using System.Net;
using System.Net.Sockets;
namespace BroadcastingStudio
{
public class UdpHelper
{
///
/// Metodo per l'invio di un pacchetto in multicast.
///
/// bytes da inviare.
public static void SendToMulticastGroup(IPEndPoint ipEndPoint, byte[] bytes)
{
UdpClient udp = new UdpClient();
udp.Send(bytes, bytes.Length, ipEndPoint);
}
}
}
Implementiamo ora la classe principale.
using System;
using System.Collections;
using System.Messaging;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.Net;
using System.Net.Sockets;
namespace BroadcastingStudio
{
class Program
{
[STAThread]
static void Main(string[] args)
{
try
{
//configurazione del multicast ...
int groupPort = 5555;
IPAddress addressGroup = IPAddress.Parse("234.5.5.1");
IPEndPoint ipEndPoint = new IPEndPoint(addressGroup, groupPort);
//pubblicherò fino fino a che il processo non verrà killato
while(true)
{
// programma parte ma sarebbe interessante trasformarlo in servzio widows!
Console.WriteLine("Waiting for message ...");
// ricevo messaggio dalla coda
MessageQueue mq = new MessageQueue(@"FormatName:DIRECT=OS:MARKINO-MOBILE\private$\InteropQueue");
mq.Formatter = new XmlMessageFormatter();
Message mqMessage = mq.Receive();
// deserializzo e stampo
XmlSerializer ser = new XmlSerializer(typeof(message));
message message = (message)ser.Deserialize(mqMessage.BodyStream);
Console.WriteLine(message.text);
// aggiungo un riferimento di passaggio nello tracking list
ArrayList messageTrackingStages = new ArrayList(message.tracking);
messageTrackingStage trackingStage = new messageTrackingStage();
trackingStage.date = DateTime.Now;
trackingStage.Value = AppDomain.CurrentDomain.FriendlyName;
messageTrackingStages.Add(trackingStage);
message.tracking = (messageTrackingStage[])messageTrackingStages.ToArray(typeof(messageTrackingStage));
// serializzo nuovamente messaggio e spedisco sulla porta 10000 via udp
MemoryStream mem = new MemoryStream();
ser.Serialize(mem, message);
byte[] dgram = mem.ToArray();
UdpHelper.SendToMulticastGroup(ipEndPoint, dgram);
Console.WriteLine("Message read and forward successfully.");
}
}
catch(Exception e)
{
Console.WriteLine(e);
}
Console.ReadLine();
}
}
}
Come potete capire il programma non ha la pretesa di essere user-friendly... per cui CTRL + C per fermarlo :-p
Nel prossimo articolo parleremo delle _radio_, i programmi per ricevere quello che il BroadcastingStudio pubblica :-D
posted @ sabato 23 aprile 2005 01:33