import javax.swing.*;
import java.net.*;
import java.io.*;
public class OnlyOneInstance {
private ServerSocket ss;
public OnlyOneInstance() {
try {
ss = new ServerSocket(65432);
System.out.println("Port wurde gebunden");
}
catch(IOException e) {
System.out.println(e.getMessage());
}
if(ss != null) {
JFrame f = new JFrame("Test-Frame");
f.setSize(600, 400);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
public static void main(String[] args) {
new OnlyOneInstance();
}
}
L-ectron-X hat gesagt.:Am allerbesten geht das vielleicht, in dem du via Sockets einen Port belegst. Wenn dieser Port belegt ist, läuft eben schon eine andere Instanz.
<security>
<all-permissions/>
</security>
L-ectron-X hat gesagt.:Ich persönlich finde auch die Lösung mit RMI ziemlich elegant.
L-ectron-X hat gesagt.:Wenn du ein bischen Geduld hast, kann ich in einigen Tagen ein Beispiel posten.
L-ectron-X hat gesagt.:Im Moment bin ich voll im Weihnachts-/Jahresendstress, da hab ich nicht viel Zeit.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class RMIFrame extends JFrame {
private JMenu file, properties;
private JMenuItem exit;
private JTextArea textArea;
public RMIFrame(String title) {
super(title);
setSize(500, 400);
setLocationRelativeTo(null);
setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
JMenuBar bar = new JMenuBar();
file = new JMenu("Datei");
exit = new JMenuItem("Beenden");
exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
exit();
}
});
file.add(exit);
bar.add(file);
setJMenuBar(bar);
textArea = new JTextArea();
add(new JScrollPane(textArea));
setVisible(true);
}
private void exit() {
int result = JOptionPane.showConfirmDialog(this,
"Möchten Sie die Anwendung wirklich beenden?",
"Programm Beenden",
JOptionPane.YES_NO_OPTION);
switch(result) {
case JOptionPane.YES_OPTION:
System.exit(0);
}
}
}
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
public class Loader extends UnicastRemoteObject implements Loadable {
private RMIFrame frame;
public Loader() throws RemoteException {
this(Registry.REGISTRY_PORT);
}
public Loader(int port) throws RemoteException {
try {
//1. RMIRegistry starten
LocateRegistry.createRegistry(port);
//2. Registrieren des Servers bei RMIRegistry
Naming.rebind("rmi:///Server", this);
//3. Erzeugen und starten der Anwendung
frame = new RMIFrame("RMIFrame");
}
catch(java.net.MalformedURLException e) {
e.printStackTrace();
}
catch(ExportException e) {
try {
//Die RMIRegistry nach der Remote-Referenz des RMI-Servers durchsuchen
Loadable loader = (Loadable)Naming.lookup("rmi://localhost/Server");
loader.load();
}
catch(NotBoundException nbe) {
nbe.printStackTrace();
}
catch(java.net.MalformedURLException murle) {
murle.printStackTrace();
}
catch(RemoteException re) {
System.out.println(re.getMessage());
}
}
}
public void load() throws RemoteException {
frame.setVisible(true);
}
public static void main(String[] args) {
try {
new Loader(); //ein benutzerdefinierter Port als Argument möglich
}
catch(RemoteException e) {
e.printStackTrace();
}
}
}
import java.rmi.*;
public interface Loadable extends Remote {
public void load() throws RemoteException;
}
public class SingleInstanceController extends UnicastRemoteObject {
public SingleInstanceController(String guid, SingleInstanceListener listener)
throws RemoteException {
super();
try {
// 1. RMIRegistry starten
LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
} catch (RemoteException e) {
System.out.println("RemoteException");
}
try {
// 2. Registrieren des Servers bei RMIRegistry
Naming.bind("rmi:///"+guid, this);
// 3a. Signalisiere "Erste Instanz"
listener.singleInstanceSignaled(true);
} catch (MalformedURLException e) {
System.out.println("MalformedURLException");
} catch (AlreadyBoundException e) {
System.out.println("AlreadyBoundException");
// 3b. Signalisiere "Zusätzliche Instanz"
listener.singleInstanceSignaled(false);
}
}
}
public interface SingleInstanceListener {
void singleInstanceSignaled(boolean isSingleInstance);
}
LocateRegistry.createRegistry(port);