Newsgroup: it.comp.java
Titolo: Cosa succede?

Salve a tutti.
Vi vorrei sottoporre un "simpatico" comportamento dato dall'accoppiata Java +
Windows.
Qui di seguito e' riportato il codice di un semplice programmino in Java.
La struttura e' banale:
- un server socket e' in ascolto sulla porta 8888;
- quando arriva una connessione l'accetta e si mette in lettura;
- se la stringa che gli arriva e' "OK" + invio fa partire la calcolatrice di
windows.
- e si rimette in ascolto.
Tutto funziona cosi' come e' stato pensato. 
Provate pero' a eseguire i seguenti passi:
1) fate partire il programmino ("java test");
2) eseguite il comando "telnet 127.0.0.1 8888" (per fare un client socket);
3) digitate "OK" e invio (se non e' abilitato l'eco locale non si vede quello
che digitate ma funziona lo stesso);
4) a questo punto la calcolatrice parte;
5) chiudete il programmino, ma non la calcolatrice;
6) il telnet vi dira' che ha perso la connessione con l'host remoto (mi sembra
anche giusto);
7) a questo punto pero' riaprite il telnet come prima ("telnet 127.0.0.1
8888");
8) la connessione viene accetta!!!!!! Da chi, se il programmino non c'e' piu'?
Dalla calcolatrice, che sembra avere ereditato la funzione di server socket dal
programmino java (per verificare cio' basta chiudere la calcolatrice; il telnet
vi dira' che ha perso la connessione co nl'host remoto).
AIUTOOOOOOOO.....
C'e' qualcuno che abbia la seppur minima idea da dove viene questo buco grande
come una casa?
E se c'e' una qualche ServicePack che riguardi il problema?
Gli ambienti provati sono Windows NT4 Workstation (SP4 e SP6a), Windows 2000
Server con JDK 1.3
Su Solaris tutto funziona correttamente (basta cambiare "calc" con
"/usr/openwin/bin/xcalc")
Grazie a tutte le persone volenterose che vorranno rispondere.
Marco
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.lang.*;
class test {
  private static ServerSocket server = null;
 
  public static void main(String[] args){
    try {
      server = new ServerSocket (8888);
      System.out.println("Waiting for connection requests...");
      while (true) {
        try{
          Socket SocketClient = server.accept();
          InputStream is = SocketClient.getInputStream();
          InputStreamReader isr=new InputStreamReader(is);
          BufferedReader br = new BufferedReader(isr);
          String arrival = br.readLine();
          if (arrival.equalsIgnoreCase("OK")){
            Runtime rt=Runtime.getRuntime();
            Process process=null;
            process=rt.exec("calc");
          }
        }catch(IOException ioe){
          System.out.println(ioe.toString());
          break;
        }catch (NullPointerException npsc){
          System.out.println(npsc.toString());
          break;
        }
      }
    }catch (IOException ioe){
      System.out.println(ioe.toString());
    }
  }
}
-- 
Posted from  [213.26.204.242] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Se tu chiudi il tuo programmino con CTRL-C, kill o similari allora il comportamento e'
possibile, puo' darsi che il socket rimanga in uno stato, diciamo per farla semplice, "non
ancora chiuso" e in tale stato permane per un po' fino a che l'OS non lo reclama.
Ti consiglio di fare in modo che il tuo programmino chiuda espressamente il socket aperto,
o fornendo un sistema esplicito o, se vuoi catturare anche il CTRL-C, utilizzando il
servizio addShutdownHook() nella classe Runtime.
Ciao,
    Bruno.
Fai in modo che il tuo progrQuando il tuo programmino


|
| Bruno Bossola
| A Java Software Engineer :-)
| 
http://bbruno.fasturl.it
|
| 
http://members.xoom.it/bbruno
| 
http://digilander.iol.it/bbossola
|

     Bruno.
-- 


Il metodo destroy() l'hai implementato? Quello dovrebbe essere chiamato: metti un paio di
stampe, sia nella stop() che nella destroy(), e vedi se vengono chiamate.
Ciao,
   Bruno.


|
