Giocando con l'interoperabilità (parte 2)

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

Print
Comments have been closed on this topic.
«aprile»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011