Newsgroup: it.comp.java
Titolo: Server sockets e sockets???

Ciao,
chi mi saprà spiegare il perchè di questa faccenda può davvero definirsi
cazzuto!
Dunque, ho due file: server.class e client.class.
La classe server eredita da Thread. All'inizio viene creato un thread che
lancia un server socket e lo lascia in ascolto su una porta.
La classe client eredita anch'essa da thread e non fa altro che creare un
thread il quale instanzia un socket che va a connettersi sulla porta dove ho
installato il mio socket server.
Quando il server sente la connessione del client mette su uno stream un
messaggio, ne fa il flush() e poi chiude la connessione.
Intanto il client si ciuccia il messaggio su uno stream in input e lo stampa
su console.
Molto bello, funziona tutto, e poi maledetto me mi viene in mente di provare
una cosa.
Come sapete, il metodo ServerSocket(0) richiamato con lo 0 come argomento,
inizializza un server su una porta che trova libera al momento.
Quindi io ho pensato:
inserisco nel codice una variabile porta dichiarata public static int
porta=60000;
Poi se mi gira di richiamare serversocket(0) richiamerò il metodo
porta=ss.getLocalPort() e mi ricaverò la porta.
Il client quando deve leggere la porta su cui connettersi richiama
semplicemente la variabile pubblica e statica server.porta e il gioco è
fatto.
E invece un par di marroni, NON FUNZIONA!
Nota bene che se inizializzo la var porta a 60000 il client legge quel
valore. Se poi cambio il valore tramite ss.getLocalPort() il server se ne
accorge (perchè lo stampa corretto) ma il client vede sempre e solo la prima
inizializzazione della variabile.
Chi mi spiega come mai?
Allego il codice completo di entrambe i file.
/*
 * server.java
 *
 * Created on 2 marzo 2004, 18.09
 */
import java.io.*;
import java.net.*;
/**
 *
 * @author  Fabrizio
 */
public class server extends Thread {
    public static int porta=60000;
    public void run() {
        try {
            ServerSocket ss=new ServerSocket(porta);
            /* provate a decommentare queste due righe e a commentare la
riga sopra a questo commento
            ServerSocket ss=new ServerSocket(0);
            porta=ss.getLocalPort();
            */
            System.out.println(porta);
            while (true) {
                Socket con=ss.accept();
                try {
                    OutputStreamWriter out=new
OutputStreamWriter(con.getOutputStream());
                    System.out.println("ciao da server");
                    out.write("messaggio proveniente dal server...");
                    out.flush();
                    con.close();
                } catch (Exception e) {
                    // cippalippa
                }
            }
        } catch (Exception ex) {
            // cippalippa
        }
    }
    public static void main(String[] args) {
        server t=new server();
        t.run();
    }
}
///// fine server.java
/*
 * client.java
 *
 * Created on 2 marzo 2004, 18.09
 */
import java.io.*;
import java.net.*;
public class client extends Thread{
    int porta=server.porta;
    public void run() {
        try {
            System.out.println(porta);
            Socket s=new Socket("localhost",porta);
            InputStreamReader in= new InputStreamReader(s.getInputStream());
            int c;
            StringBuffer sb=new StringBuffer();
            System.out.println("ciao da client, siamo sulla porta "+porta);
            while ((c=in.read())!=-1) {
                sb.append((char) c);
            }
            System.out.println(sb.toString());
        } catch (Exception e) {
            // cippalippa
        }
    }
    public static void main(String[] args) {
        client p=new client();
        p.start();
    }
}
//// fine client.java
Potete copiare e incollare e compilare e vedrete che funziona tutto a
meraviglia, ma decommentate il codice come suggerito nel codice stesso e
vedrete che non va più.
AIUTO!!!
grazie a chi mi risponderà!
Fabrizio

Ciao!
Ho dato una lettura al tuo codice e non mi è ben chiara questa istruzione
di client.java:
    int porta=server.porta;
Purtroppo non ho il tempo e la pazienza ora di testare il codice.
Tu hai due classi e quindi lanci i due programmi, giusto?
In una finestra del terminale avvii il server, in un'altra il client.
Come fa quindi il server a passare al client la porta a cui connettersi?
Nell'ipotesi reale si immagina che client e server siano distanti tra
loro...
Alex.
-- 
___________________________________________________________
a p bertolini
(
www.webwarrior.org
)

 Ho dato una lettura al tuo codice e non mi č ben chiara questa istruzione


Ciao, fabrizio!
Il giorno 02/03/2004 alle ore 23:56 hai scritto:
 fr> I problemi sorgono dopo, quando io cambio il valore della variabile
 fr> dalla classe server, allora il client non rileva più il corretto
 fr> valore, ma rileva sempre il valore che ho passato alla variabile al
 fr> momento dell'inizializzazione.
Scusa ma e' ovvio che la variabile ha lo stesso valore che aveva
all'inizializzazione, come pretendi che si possa aggiornare da sola ? Se
vuoi usare sempre il valore aggiornato devi usare sempre server.porta o
rifare l'assegnazione ogni volta che ti serve.
Poi rimane il dubbio sui processi. Ci sono due main il che fa supporre che
tu lanci due processi separati uno server e uno client, il che rende
impossibile la comunicazione come la intendi tu.
Bye
-- 
Marco Maccaferri
MaccaSoft - 
http://www.maccasoft.com


Come ti ha gia' fatto notare Alex non c'e' nessuna condivisione a 
run-time fra due diversi processi di una stessa variabile static.
I socket non c'entrano niente.
E' proprio la condivisionne a run-time che non c'e'.
Per essere + chiaro e pedissequo esegui (anche solo mentalmente!)
i seguenti due programmi e vedi (o immagina) cosa scrivano!
// file server.java
public class server {
   public static int porta=60000;
   public static void main(String[] args) throws Exception {
     while(true) {
       porta++;
       Thread.sleep(1000);
     }
   }
}
// file client.java
public class client {
   public static void main(String[] args) throws Exception {
     while(true) {
       System.out.println("server.porta=" + server.porta);
       Thread.sleep(1000);
     }
   }
}

 ha scritto nel messaggio
news:c244a0$mgj$1...@grillo.cs.interbusiness.it...


  fr> dalla classe server, allora il client non rileva piů il corretto


Ciao, fabrizio!
Il giorno 03/03/2004 alle ore 11:53 hai scritto:
 fr> Scusa ma hai fatto girare il codice?
Si, anche se non ci sarebbe bisogno, l'errore e' evidente come il Sole, come
ti ho gia' spiegato.
 fr> Perchè non è che la var venga cambiata 1000 volte.
Ma tu la inizializzi nel modo sbagliato.
 fr> Viene cambiata una volta sola. Dopo che è stata cambiata se tu lanci
 fr> client (server sta girando col valore aggiornato) client ti becca il
 fr> primo valore assegnato alla var e non quello corrente.
A me becca 60000 che e' corretto. Server visualizza 1791 (si ho fatto
partire prima server e poi client). E' ovvio che cio' accada, due processi
non comunicano cosi' come credi tu.
 fr> Questo è il problema, la var la vede benissimo.
E' quello che credi tu, si tratta di un semplice side-effect che non ha
nulla a che vedere con la comunicazione tra processi.


 ha scritto nel messaggio
news:9jj1c.45053$Kc3.1...@twister2.libero.it...


Ciao, fabrizio!
Il giorno 03/03/2004 alle ore 12:52 hai scritto:
 fr> Ok, allora diciamo che un mese non basta per imparare java... doh!
Qui si tratta di una lacuna di base sulla comunicazione tra processi che
esula dal discorso Java.
 fr> Comunque, cosa intendi per la inizializzi nel modo sbagliato? come
 fr> dovrei inzializzarla?
 fr>
 fr> E se questo non risolvesse il problema, come posso fare per creare una
 fr> variabile "globale" che possa leggere e aggiornare da server e
 fr> successivamente leggerne il valore corretto da client?
Dopo aver inizializzato la variabile porta da server salvi il valore in un
file (ad esempio in C:\Temp\mysocket). Il client legge quel file e imposta
la sua variabile porta con il valore contenuto in quel file e il gioco e'
fatto. Ovvio che se server cambia valore a porta devi rifare tutto (salvare
da server e rileggere da client).


 ha scritto nel messaggio
news:fNj1c.45128$Kc3.1...@twister2.libero.it...


 della variabile.
Il processo client vede la sua variabile che nessuno aggiorna!
Il processo server aggiorna la sua variabile che nessuno stampa!
- Dario