Hallo,
ich habe eine einfache Hello-World-Applikation erstellt, bei der Client und Server über ein Intranet miteinander kommunizieren. Als Schnittstelle habe ich CORBA implementiert.
Den Server habe ich in Java (JDK 1.5.0) geschrieben (unter Verwendung des JacORBs) und er läuft unter Linux. Die Referenz des CORBA-Objektes lasse ich in eine Datei "Hello.ref" schreiben.
Diese refFile kopiere ich nun (bisher erstmal per Hand) auf einen anderen Rechner.
Auf dem zweiten Rechner läuft nun der Client, den ich in Delphi (Delphi 6 IDE) in Windows (unter Verwendung des VisiBrokers 4.1) geschrieben habe.
Der Client soll die Referenz aus der refFile laden und die say_hello-Methode des Server-Objektes aufrufen - das war's eigentlich schon.
Folgendermaßen starte ich die Programme:
1. Kompilieren des IDL-Moduls unter Linux: idljaco Hello.idl
2. Kopieren der Java-Dateien in den Package-Pfad: cp *.java HelloObj
3. Kompilieren des Java-Servers unter Linux: javac HelloObj/*.java
4. Java-Server unter Linux starten: java HelloObj.Server&
5. Erstellte Datei Hello.ref auf Windows-Rechner kopieren (mittels USB-Stick)
6. Kompilieren des IDL-Moduls unter Windows: idl2pas Hello.idl
7. Delphi-Client kompilieren
8. CORBA-Agent unter Windows starten: osagent
9. Delphi-Client starten
Server und Client können jeweils problemlos kompiliert und gestartet werden!
Nun habe ich das Problem, dass der Client keine Verbindung zum Server herstellt, somit also auch die Methode say_hello nicht aufgerufen wird.
Ausschließlich Die von mir eingebaute Meldung "Hello is a nil reference" wird beim Client angezeigt. Ich nehme also an, dass das Hello-Objekt nicht aus der Referenz gebildet werden kann.
Ich habe allerdings keine Ahnung, wo hier der Fehler liegt - stimmt mein Vorgehen nicht oder haben die Programmcodes Fehler?
Ich hoffe mir kann jemand weiterhelfen...
/** Beginn Hello.idl **/
module HelloObj {
interface Hello {
string say_hello();
};
};
/** Ende Hello.idl **/
/** Beginn Hello_impl.java **/
package HelloObj;
public class Hello_impl extends HelloPOA {
public String say_hello() {
return "Hello World!";
}
}
/** Ende Hello_impl.java **/
/** Beginn Server.java **/
package HelloObj;
import java.io.*;
import java.util.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
public class Server {
public static void main(String[] args) {
Properties props = System.getProperties();
ORB orb = null;
try {
orb = ORB.init(args, props);
POA rootPOA = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
POAManager manager = rootPOA.the_POAManager();
Hello_impl helloImpl = new Hello_impl();
Hello hello = helloImpl._this(orb);
try {
String ref = orb.object_to_string(hello);
String refFile = "Hello.ref";
FileOutputStream file = new FileOutputStream(refFile);
PrintWriter out = new PrintWriter(file);
out.println(ref);
out.flush();
file.close();
} catch (IOException ex) {
System.err.println(ex.getMessage());
System.exit(-1);
}
manager.activate();
orb.run();
} catch (Exception ex) {
ex.printStackTrace();
System.exit(-1);
}
System.exit(0);
}
}
/** Ende Server.java **/
/** Beginn Client.pas **/
unit Client;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, CORBA, HelloObj_c, HelloObj_i, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
protected
H: Hello;
Obj: CORBAObject;
F: TextFile;
ref, refFile: String;
procedure InitCorba;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.InitCorba;
begin
CorbaInitialize;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
InitCorba;
refFile := 'Hello.ref';
AssignFile(F, refFile);
Reset(F);
ReadLn(F, ref);
CloseFile(F);
ShowMessage(ref);
Obj := Orb.StringToObject(ref);
If Obj = nil Then
begin
ShowMessage('Object is a nil reference');
Exit;
end;
H := THelloHelper.Narrow(Obj);
If H = nil Then
begin
ShowMessage('Hello is a nil reference');
Exit;
end;
ShowMessage(H.say_hello);
end;
end.
/** Ende Client.pas **/
Ich danke schonmal für Hilfe!
Viele Grüße,
Kay