andbin ha scritto:
EDIT: anzi, è più giusto dire che la seconda istanza cerca di "ascoltare" su quella stessa porta e ovviamente è già in uso, quindi il bind fallisce. Allora può poi connettersi a quella porta per notificare la prima istanza, ad esempio per dirgli di mettersi in primo piano (tanto per dire uno scenario sensato).
Caro @
andbin
Ti ringrazio di cuore per l'indicazione, perché ho implementato proprio la logica che mi hai descritto!
Durante questi giorni di forzata assenza di lavoro, ho avuto un po più di tempo per studiare e fare prove e ... dopo guide, tutorial, manuali, esempi trovati sul web, prove, riprove e testate contro il muro (metaforicamente parlando) mi sembra di esserci riuscito!!!
Dico "sembra" perché durante questo faticoso percorso mi sono capitate cose strane, come il fatto che un giorno, sembrava funzionare e il giorno dopo non partiva nemmeno il programma e non capivo il perché.
Poi magicamente, dopo aver fatto una modifica apparentemente ininfluente tornava a funzionare ... boh?
Alla fine con l'uso dei thread e dei socket riesco ad intercettare l'istanza precedente e a portarla in primo piano!
Mi restano ancora un mucchio di domande senza risposta, sicuramente perché non ho ancora studiato abbastanza.
La cosa che mi preoccupa di più è che non ho utilizzato alcun tipo di sincronismo, che è un argomento di cui non ancora capito nulla e che tu mi avevi suggerito di utilizzare.
Mi preoccupa perché non so se potrebbero verificarsi situazioni in cui senza sincronismo il tutto potrebbe bloccarsi.
Poi non ho capito perché dal lato server per scrivere un messaggio si usa
OutputStream con
BufferedWriter che spedisce una
String, mentre per leggere si usa
InputStream che legge un
vettore di byte di cui bisogna stabilire la dimensione a priori. E invece nel client bisogna usare DataOutputStream che spedisce una String e bisogna leggere ancora con InputStream che usa il solito vettore di byte?
Poi resta il mistero del come mai su windows per portare in primo piano l'istanza già in esecuzione è sufficiente la sequenza:
myForm.setState(JFrame.NORMAL);
myForm.toFront();
myForm.requestFocus();
dove myForm è il JFrame contenitore del programma.
mentre su Kubuntu devo anteporre:
myForm.setVisible(false);
myForm.setVisible(true);
Non ho ancora fatto le prove per verificare se servono veramente tutte le istruzioni riportate o se ne basterebbero di meno, ma così al momento funziona.
Per completare l'opera ho altri problemi da risolvere ma sono altri argomenti, per cui almeno questo sembra risolto.