Hallo,
ich habe meine erste Testanwendung mit CORBA geschrieben. Habe es bisher nur lokal ausprobiert. Es funktioniert soweit. Der Client macht Screenshots in bestimmten Zeitabständen und sendet diese an den Server, der diese in einem JFrame zeichnet.
Remote.idl
GUIClient.java
DelegationServer.java
RemoteDelegate.java
Das Ziel dieser Client Server Anwendung ist, das der der den Server bei sich laufen hat, den Desktop des PCs mit dem Clienten life miterleben darf. Life heißt dann, vielleicht ein Paar Screenshots pro Sekunde.
Der Client wandelt das Screenshot welchen der Robot schießt in ein int array das zum Server gesendet und dort gezeichnet wird.
Ist das so OK, das mehrmals pro Sekunde eine remote Verbindung über das Internet aufgebaut wird. Oder gibt es da eine effizientere Variante, bei dem vielleicht, eine Verbindung aufgebaut wird, welche auch beständig bleibt, über diese eine Verbindung dann das Bild beständig gesendet werden kann?
Vg Erdal
ich habe meine erste Testanwendung mit CORBA geschrieben. Habe es bisher nur lokal ausprobiert. Es funktioniert soweit. Der Client macht Screenshots in bestimmten Zeitabständen und sendet diese an den Server, der diese in einem JFrame zeichnet.
Remote.idl
Code:
interface Remote
{
typedef sequence<long> pixSeq;
void dump(in long width, in long height, in pixSeq pixels);
};
GUIClient.java
Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.*;
import javax.swing.*;
import org.omg.CORBA.*;
import static java.lang.System.*;
public class GUIClient extends JPanel {
private ORB orb;
private Remote r;
private BufferedImage bufImg;
private Dimension d;
private int[] iArray;
private Robot rob;
private void initializeORB(String[] args) {
Properties props = getProperties();
orb = ORB.init(args, props);
}
private org.omg.CORBA.Object getRef(String refFile) {
String ref = null;
try {
Scanner reader = new Scanner(new File(refFile));
ref = reader.nextLine();
} catch (IOException ex) {
out.println("File error: "
+ ex.getMessage());
exit(2);
}
org.omg.CORBA.Object obj = orb.string_to_object(ref);
if (obj == null) {
out.println("Invalid IOR");
exit(4);
}
return obj;
}
private void createGUI() {
final JLabel label = new JLabel(" ");
label.setForeground(Color.RED);
add(label);
rob = null;
try {
rob = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
bufImg = null;
d = Toolkit.getDefaultToolkit().getScreenSize();
iArray = new int[d.width*d.height];
new Thread() {
public void run() {
while (true){
try {
bufImg = rob.createScreenCapture(new Rectangle(d));
bufImg.getRGB(0, 0, d.width, d.height, iArray,0,d.width);
label.setText(" \u2022 ");
r.dump(d.width,d.height,iArray);
label.setText(" ");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
public GUIClient(String[] args, String refFile) {
initializeORB(args);
org.omg.CORBA.Object obj = getRef(refFile);
try {
r = RemoteHelper.narrow(obj);
} catch (BAD_PARAM ex) {
out.println("Narrowing failed");
exit(3);
}
createGUI();
}
public static void main(String[] args) {
try {
String refFile = "Remote.ref";
JDialog d = new JDialog(new JFrame(),"Qalem Remote Client");
d.getContentPane().add(
new GUIClient(args, refFile));
d.pack();
d.setAlwaysOnTop(true);
d.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
d.setVisible(true);
} catch (Exception ex) {
out.println("Exception: " + ex.getMessage());
exit(1);
}
}
}
DelegationServer.java
Java:
import java.io.*;
import java.util.Properties;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import javax.swing.*;
import static java.lang.System.*;
public class DelegationServer {
public static void main(String[] args) {
try {
RemoteDelegate rd;
JFrame f = new JFrame("Qalem Remote Server 0.1");
f.getContentPane().add(rd = new RemoteDelegate());
f.setSize(200,200);
f.setLocationByPlatform(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setAlwaysOnTop(true);
f.setVisible(true);
Properties props = getProperties();
ORB orb = ORB.init(args, props);
org.omg.CORBA.Object obj = null;
POA rootPOA = null;
try {
obj = orb.resolve_initial_references("RootPOA");
rootPOA = POAHelper.narrow(obj);
} catch (org.omg.CORBA.ORBPackage.InvalidName e) { }
RemotePOATie r_impl = new RemotePOATie(rd);
Remote r = r_impl._this(orb);
try {
FileOutputStream file =
new FileOutputStream("Remote.ref");
PrintWriter writer = new PrintWriter(file);
String ref = orb.object_to_string(r);
writer.println(ref);
writer.flush();
file.close();
out.println("Server started."
+ " Stop: Close-Button");
} catch(IOException ex) {
err.println("File error: "
+ ex.getMessage());
exit(2);
}
rootPOA.the_POAManager().activate();
orb.run();
} catch(Exception ex) {
out.println("Exception: " + ex.getMessage());
exit(1);
}
}
}
RemoteDelegate.java
Java:
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class RemoteDelegate extends JPanel
implements RemoteOperations {
private BufferedImage bufImg;
public void dump (int width, int height, int[] pixels){
bufImg = new BufferedImage(width, height,BufferedImage.TYPE_INT_ARGB);
bufImg.setRGB(0, 0, width, height, pixels, 0, width);
this.repaint();
}
public void paint (Graphics g){
super.paint(g);
if (bufImg != null)
g.drawImage(bufImg, 0, 0, this);
}
}
Das Ziel dieser Client Server Anwendung ist, das der der den Server bei sich laufen hat, den Desktop des PCs mit dem Clienten life miterleben darf. Life heißt dann, vielleicht ein Paar Screenshots pro Sekunde.
Der Client wandelt das Screenshot welchen der Robot schießt in ein int array das zum Server gesendet und dort gezeichnet wird.
Ist das so OK, das mehrmals pro Sekunde eine remote Verbindung über das Internet aufgebaut wird. Oder gibt es da eine effizientere Variante, bei dem vielleicht, eine Verbindung aufgebaut wird, welche auch beständig bleibt, über diese eine Verbindung dann das Bild beständig gesendet werden kann?
Vg Erdal