ich habe mich die letzten Tage mit den Communications Components beschäftigt und habe nun eine Frage dazu bzw. ein Problem.
Ich habe zwei Testcodeunits geschrieben, welche untereinander Nachrichten austauschen sollen auf verschiedenen PCs.
Dafür dient ein PC als Empfänger und der andere sendet ihm eine Nachricht.
Die Nachricht kann ich ohne Probleme übertragen. Das funktioniert soweit. Ich hätte nur gerne vom Empfänger eine Reply Message zurückerhalten.
Das funktioniert leider nicht so wie ich mir das vorstelle. Meine RĂĽckantwort ist immer leer, solange die Kommunikation auf zwei unterschiedlichen Rechnern passiert.
Stelle ich das Ganze aber auf einem einzelnen Rechner nach (D.h. den Client auf einem Rechner zweimal öffnen), funktioniert es einwandfrei.
Hat sich mit dem Thema schon mal jemand beschäftigt?
Hier ist mein Testcode, den ich mit Hilfe der devguide.chm erstellt habe. (In Textdatei kopieren und importieren)
- Code: Alles auswählen
OBJECT Codeunit 50998 Send IP Port mit Reply
{
OBJECT-PROPERTIES
{
Datum=12.10.11;
Zeit=10:45:06;
Ge„ndert=Ja;
Versions Liste=SalAG;
}
PROPERTIES
{
OnRun=BEGIN
Send('localhost',8079);
END;
}
CODE
{
VAR
CC2@1000000000 : Automation "{F9A57667-8AC5-45C5-9416-99D3955BCAC0} 1.0:{01018FA5-E4B4-413C-A47C-AD34B0CC2647}:'Navision Communication Component version 2'.CommunicationComponent" WITHEVENTS;
SBA@1000000001 : Automation "{CF450AFF-91CE-4DF0-92DE-AFE4C28AAFC7} 1.0:{4CBE9566-34EA-429D-963A-911E270CBE4F}:'Navision Socket Bus Adapter'.SocketBusAdapter";
OutMsg@1000000002 : Automation "{F9A57667-8AC5-45C5-9416-99D3955BCAC0} 1.0:{6CB9762C-E61C-4F96-BA34-8B20D3A5B46E}:'Navision Communication Component version 2'.OutMessage";
ReplyMsg@1000000004 : Automation "{F9A57667-8AC5-45C5-9416-99D3955BCAC0} 1.0:{D184D0AC-61C9-4AC1-B537-0D28C277FEDE}:'Navision Communication Component version 2'.InMessage";
OutS@1000000003 : OutStream;
InStrm@1000000006 : InStream;
Reply@1000000005 : Boolean;
txt@1000000007 : Text[1000];
retval@1000000008 : Integer;
PROCEDURE Send@1000000000(Receiver@1000000000 : Text[30];Port@1000000001 : Integer);
BEGIN
IF ISCLEAR(CC2) THEN
CREATE(CC2);
IF ISCLEAR(SBA) THEN
CREATE(SBA);
CC2.AddBusAdapter(SBA, 0);
OutMsg:= CC2.CreateoutMessage('Sockets://' + Receiver + ':' + FORMAT(Port));
OutS:= OutMsg.GetStream();
OutS.WRITE('KOM0000000,4,1,2');
ReplyMsg := OutMsg.SendWaitForReply(10);
InStrm := ReplyMsg.GetStream;
WHILE NOT (InStrm.EOS) DO
BEGIN
InStrm.READ(txt);
MESSAGE(txt);
END;
MESSAGE(txt);
ReplyMsg.CommitMessage;
MESSAGE('fertig');
END;
EVENT CC2@1000000000::MessageReceived@1(VAR InMessage@1000000000 : Automation ":{00020400-0000-0000-C000-000000000046}:''.IDISPATCH");
BEGIN
END;
BEGIN
END.
}
}
OBJECT Codeunit 51000 Receive Msg IP Port mit Reply
{
OBJECT-PROPERTIES
{
Datum=11.10.11;
Zeit=15:32:46;
Ge„ndert=Ja;
Versions Liste=SalAG;
}
PROPERTIES
{
SingleInstance=Ja;
OnRun=BEGIN
Start(8079);
END;
}
CODE
{
VAR
CC2@1000000000 : Automation "{F9A57667-8AC5-45C5-9416-99D3955BCAC0} 1.0:{01018FA5-E4B4-413C-A47C-AD34B0CC2647}:'Navision Communication Component version 2'.CommunicationComponent" WITHEVENTS;
SBA@1000000001 : Automation "{CF450AFF-91CE-4DF0-92DE-AFE4C28AAFC7} 1.0:{4CBE9566-34EA-429D-963A-911E270CBE4F}:'Navision Socket Bus Adapter'.SocketBusAdapter";
InMsg@1000000002 : Automation "{F9A57667-8AC5-45C5-9416-99D3955BCAC0} 1.0:{D184D0AC-61C9-4AC1-B537-0D28C277FEDE}:'Navision Communication Component version 2'.InMessage";
InS@1000000003 : InStream;
txt@1000000004 : Text[1000];
Reply@1000000005 : Boolean;
ReplyMsg@1000000006 : Automation "{F9A57667-8AC5-45C5-9416-99D3955BCAC0} 1.0:{6CB9762C-E61C-4F96-BA34-8B20D3A5B46E}:'Navision Communication Component version 2'.OutMessage";
OutStrm@1000000007 : OutStream;
PROCEDURE Start@1000000000(Port@1000000000 : Integer);
BEGIN
IF ISCLEAR(CC2) THEN
CREATE(CC2);
IF ISCLEAR(SBA) THEN
CREATE(SBA);
CC2.AddBusAdapter(SBA, 0);
SBA.OpenSocket(Port, '');
END;
EVENT CC2@1000000000::MessageReceived@1(VAR InMessage@1000000000 : Automation ":{00020400-0000-0000-C000-000000000046}:''.IDISPATCH");
BEGIN
InMsg:= InMessage;
InS:= InMsg.GetStream();
WHILE NOT (InS.EOS) DO
BEGIN
InS.READ(txt);
MESSAGE(txt);
END;
Reply := InMsg.ExpectReply;
IF Reply THEN BEGIN
ReplyMsg := InMsg.CreateReply;
OutStrm := ReplyMsg.GetStream;
OutStrm.WRITETEXT('Reply message',13);
ReplyMsg.Send(0);
END;
InMsg.CommitMessage();
END;
BEGIN
END.
}
}
Ich hoffe es kann mir jemand weiterhelfen.
Vielen Dank.