Spartakus Skrevet 9. mars 2007 Skrevet 9. mars 2007 (endret) ref https://www.diskusjon.no/index.php?showtopic=712378 jorn79: Jeg har kommet litt lenger med koden etter jeg sendte deg PM. Jeg har gitt opp pipes i .NET og skal prøve meg på MQ i stedet. Jeg får kompilert koden under, men jeg får en feil ved kjøring. VS klager på linja MQ.BeginReceive(); (under GoServer())og mener den er på "ugyldig format" (jeg har norsk språkpakke til .net 2.0). Hva er galt? Etter det jeg kan se, så trenger vel ikke noen spesiell lytter for å motta meldinger, iom at MessageQueue har ReceiveCompleted-event? Dette er egentlig bare et testprogram for å se om jeg fikk MSMQ til å fungere. Første instans av programmet oppretter køen og fungerer som server. Andre instans fungerer som klient og skal kun overføre en melding til server. Server skal i teorien vise meldinga i en MessageBox, men programmet feiler før de kommer så langt. Så aner ikke om det vil fungere slik jeg vil det skal gjøre. Form1.cs Klikk for å se/fjerne innholdet nedenfor using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace wmqcs { public partial class Form1 : Form { string qpath = Environment.MachineName + @"\Private$\testq"; bool server = false; public Form1() { InitializeComponent(); MQ.Formatter = new MQFormat(); if (ChooseMode()) //true = server, false = client GoServer(); else GoClient(); } private void GoServer() { MQ.BeginReceive(); } private void GoClient() { MQ.Send(Environment.TickCount.ToString()); } private bool ChooseMode() { if (!System.Messaging.MessageQueue.Exists(qpath)) { System.Messaging.MessageQueue.Create(qpath, false); MQ.DenySharedReceive = true; MQ.ReceiveCompleted += new System.Messaging.ReceiveCompletedEventHandler(MQ_ReceiveCompleted); label1.Text = "Server"; server = true; return true; } else { MQ.Path = qpath; label1.Text = "Client"; return false; } } void MQ_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e) { MessageBox.Show(e.Message.Body.ToString()); MQ.BeginReceive(); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (server && System.Messaging.MessageQueue.Exists(qpath)) System.Messaging.MessageQueue.Delete(qpath); } } } MQ er et objekt av typen System.Messaging.MessageQueue. MQFormat.cs (for å definere eget format på meldingene) Klikk for å se/fjerne innholdet nedenfor using System; using System.Collections.Generic; using System.Text; using System.Messaging; using System.IO; namespace wmqcs { public class MQFormat : IMessageFormatter { public MQFormat() { } public void Write(System.Messaging.Message msg, object obj) { //Declare a buffer. byte[] buff; //Place the string into the buffer using UTF8 encoding. buff = Encoding.UTF8.GetBytes(obj.ToString()); //Create a new MemoryStream object passing the buffer. Stream stm = new MemoryStream(buff); //Assign the stream to the message's BodyStream property. msg.BodyStream = stm; } public object Read(System.Messaging.Message msg) { //Obtain the BodyStream for the message. Stream stm = msg.BodyStream; //Create a StreamReader object used for reading from the stream. StreamReader reader = new StreamReader(stm); //Return the string read from the stream. //StreamReader.ReadToEnd returns a string. return reader.ReadToEnd(); } public bool CanRead(System.Messaging.Message msg) { return true; } public object Clone() { return new MQFormat(); } } } Solution fila: http://www.hiof.no/~vidarfle/stuff/wmqcs.rar Message Queueing må være installert på maskinen, gjøres fra "Legg til/fjern Windows-komponenter" En annen ting: ved kjøring opprettes køen, men siden programmet krasjer, så blir ikke køen fjernet, den må da slettes manuelt fra "Datamaskinbehandling->Tjenester og programmer->Message Queueing->Private køer" Køen heter "testq" Ja, jeg vet jeg kunne fiksa det med en Exception greie, men har bare ikke giddi Edit: Etter massefeilsøking og googling, fant jeg det ut Klikk for å se/fjerne innholdet nedenfor using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace wmqcs { public partial class Form1 : Form { string qpath = Environment.MachineName + @"\private$\testq"; System.Messaging.Message msg; bool server = false; public Form1() { InitializeComponent(); MQ = new System.Messaging.MessageQueue(qpath); MQ.Formatter = new System.Messaging.XmlMessageFormatter(new string[] {"System.String"}); if (ChooseMode()) GoServer(); else GoClient(); } private void GoServer() { msg = new System.Messaging.Message(); msg.Formatter = new System.Messaging.XmlMessageFormatter(new string[] { "System.String" }); MQ.BeginReceive(); } private void GoClient() { MQ.Send(Environment.TickCount.ToString()); } private bool ChooseMode() { if (!System.Messaging.MessageQueue.Exists(qpath)) { System.Messaging.MessageQueue.Create(qpath, false); MQ.ReceiveCompleted += new System.Messaging.ReceiveCompletedEventHandler(MQ_ReceiveCompleted); label1.Text = "Server"; server = true; return true; } else { MQ.Path = qpath; label1.Text = "Client"; return false; } } void MQ_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e) { msg = MQ.EndReceive(e.AsyncResult); string s = (string)msg.Body; MessageBox.Show(s); MQ.BeginReceive(); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (server && System.Messaging.MessageQueue.Exists(qpath)) System.Messaging.MessageQueue.Delete(qpath); } } } Endret 12. mars 2007 av xtc
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå