Newsgroup: it.comp.java
Titolo: Come intercettare altre istanze della classe in esecuzione?

Salve, ho costruito un'applicazione e l'ho associata ad un tipo di file, in
modo da visualizzarne il contenuto tramite di essa. Tuttavia, ho un effetto
del tipo "MDI" nel senso che ogni volta che apro un file del tipo in esame,
mi viene lanciata un'altra istanza della classe. Invece io vorrei che il
file venisse visualizzato dall'istanza gia' in esecuzione! Come faccio a
"catturare" il lancio e a indirizzarlo verso l'istanza gia' in esecuzione?
Cosa devo cercare? Runtime, System?
~~
artemis.alpeia

 "catturare" il lancio e a indirizzarlo verso l'istanza gia' in esecuzione?
IPC; l'istanza apre un serversocket su una porta ben nota e lancia un thread
che rimane in attesa. Se una nuova istanza viene creata, non riesce ad aprire
il serversocket; in questo caso capisce che c'è un predecessore e gli comunica
quel che deve fare. Il tutto si semplifica ovviamente all'interno della
medesima VM, usi una variabile statica di classe.
Ciao,
 Stefano
----------
"X WindowSSS, teSSSoro mio... lo odieremo per SSSempre"
Bill Gollum
----------

 medesima VM, usi una variabile statica di classe.
grazie per il suggerimento
~~
artemis.alpeia

 > medesima VM, usi una variabile statica di classe.
purtroppo aprendo il file del tipo in esame viene lanciata una nuova istanza
della JVM, quindi ahime' niente variabili di classe.
con grande gioia del mio firewall, ho optato per un thread in ascolto su una
porta. Se a qualcuno dovesse interessare, allego lo scheletro della classe
---
import java.net.*;
import java.io.*;
import javax.swing.JFrame;
public class SDITest
{
   private final int PORT = 12345;
   private JFrame jFrame = new JFrame("Prova");
   public static void main(String[] args)
   {  new SDITest(args);
   }
   public SDITest(String[] args)
   {
      try
      {  ServerSocket serverSocket = new ServerSocket(PORT);
  // avvia il thread per monitorare la porta
  new PortHandler(this, serverSocket, PORT).start();
  jFrame.setVisible(true);
  jFrame.setSize(150, 100);
      }
      catch (Exception e)
      {  // un'altra istanza della classe è già in esecuzione
  try
  {  Socket socket = new Socket(InetAddress.getLocalHost(), PORT);
     // negozia con l'istanza in esecuzione
     PrintWriter out = new PrintWriter(socket.getOutputStream(), true /*
autoflush */);
     if (args.length > 0)
        out.println("Apri l'immagine selezionata");
     else
        out.println("Reindirizzamento sull'istanza gia' in esecuzione");
     out.close();
     System.exit(0);
  }
  catch (Exception ne)
  {  ne.printStackTrace();
  }
      }
   }
   public void setTitle(String title)
   {  jFrame.setTitle(title);
   }
}
class PortHandler extends Thread
{  private SDITest parent;
   private int port;
   private ServerSocket serverSocket;
   public PortHandler(SDITest parent, ServerSocket serverSocket, int port)
   {  this.parent = parent;
      this.serverSocket = serverSocket;
      this.port = port;
   }
   public void run()
   {  for ( ; ; )
      {  try
  {  Socket socket = serverSocket.accept();
     handleRequest(socket);
  }
  catch (Exception e)
  {  e.printStackTrace();
  }
      }
   }
   public void handleRequest(Socket socket) throws IOException
   {  BufferedReader br = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
      String line = br.readLine();
      parent.setTitle(line);
      br.close();
   }
}
~~
artemis.alpeia