Newsgroup: it.comp.java
Titolo: Socket e chiusura socket.

Salve a tutti, avrei un problema con le socket, ovvero, dopo aver fatto
tutte le operazioni necessarie e vado per inserire il codice di chiusura
della socket, in fase di compilazione ottengo un messaggio di errore :
[pippo@pippo Network]$ javac server.java
server.java:96: cannot find symbol
symbol  : variable socket
location: class server
            socket.close();
            ^
1 error
Non capisco dov sbaglio, vi allego il codice (anche se un po' lunghetto) :
import java.net.*;
import java.util.*;
import java.io.*;
class server implements Runnable {
    Thread serverThread;
    ServerSocket sSocket;
 
    private final int PORT = 9876;
    private String threadName = "Server";   
    server() {
 
	serverThread = new Thread(this, threadName);
 
	serverThread.start();
 
    }
 
    /*
      ===============================
      =                             =
      = Punto di accesso del thread =
      =                             =
      ===============================
    */
 
    public void run() {
 
	System.out.println("\nServer : " + serverThread + "\n");
 
	try{
	    sSocket = new ServerSocket(PORT);
	    System.out.println("               --------------------- Server Info ------------------------");
	    System.out.println("Creazione della sSocket in ascolto sulla porta " + sSocket.getLocalPort() + " sull'host " + InetAddress.getLocalHost() + " .");
	    System.out.println("               ----------------------------------------------------------");
 
	    while(true){
		System.out.println("\nIn attesa di una client call...");
		Socket socket = sSocket.accept();
 
		System.out.println("\n          ------------------- Client Info ----------------------");
		InetAddress clientAddress = socket.getInetAddress();
		int clientPort = socket.getPort();
		System.out.println("Client con indirizzo " + clientAddress + "sulla porta " + clientPort + " .");
		System.out.println("            ------------------------------------------------------");
		// --- Inizio sezione di comunicazione ---
 
		//BufferedInputStream input = new BufferedInputStream(s.getInputStream());
		DataOutputStream output = new DataOutputStream(socket.getOutputStream());
		BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
 
		while(true){
 
		    // Leggo l'input della socket
		    String msgClient = br.readLine();
		    output.writeBytes(msgClient + "\n");
		    System.out.println(msgClient);
		}
 
	    }
	    //Chiudo il collegamento con il client, qui mi da errore in fase di
		//compilazione	    
 
	socket.close();
 
	} catch(IOException e) {
	    System.out.println(e);
	}
    }
    public static void main(String [] args) {
	new server();
 
    }
}
Scusate se il tutto e' un po' lunghetto, ma non capisco prorpio dove
sbaglio... magari faccio una pausetta e mi rimetto sotto..!!
PS : questi sono solo esempi di programmazione delle socket per capire
come funziona il tutto in previsione di un progetto per l'Uni.
Grazie a tutti.
BenB

 Non capisco dov sbaglio, vi allego il codice (anche se un po' lunghetto) :
Hai scritto quella riga nel punto sbagliato, fuori dallo scope delle 
variabile socket. Devi metterlo dentro al primo while!
Se mi permetti un'osservazione, come fa a funzionare tutta questa roba? 
Non rischi di restare bloccato nel while(true) interno?
Saluti
CarMas

 Socket socket = sSocket.accept();
Qui, sbagli.
E' un problema di scope della variabile.
Tu stai definendo la variabile socket all'interno del ciclo while.
Pertanto all'esterno del ciclo non esiste.
Devi fare cosě:
Socket socket;
while(true){
    socket = sSocket.accept();
}
Ciao
Marco 

>>>> "B1" == BenB 155 <b...@b.155_it> writes:
B1> Salve a tutti, avrei un problema con le socket, ovvero, dopo aver
                                         ^^^^^^^^^
Ocio, sarebbe maschile in italiano.
B1> socket.close(); ^ 1 error
La hai definita NEL ciclo while. Definiscila fuori dal ciclo.
-- 
 /\            ___
/___/\__|_|\_|__|___Gian Uberto Lauri_____________________
  //--\ | | \|  |   Integralista GNUslamico  
\/		    e allevatore di bug da competizione

 Ocio, sarebbe maschile in italiano.
IL socket??? :-|
E da quando?
Ciao
Marco 

>>>> "n" == napo  <na...@NOPRIVATEMESSAGE.com> writes:
n> IL socket??? :-| E da quando?
Da quando  è un neutro in  inglese. Ora l'italiano perse  il neutro un
tot di secoli fa, e quindi si usa il neutro.
Poi è anche una questione di abitudini.
Sono 16 anni  circa che sento socket al maschile  quindi mi suona male
al  femminile, ma  è altrettanto  vero che  sono altrettanti  anni che
sento  password al femminile  (pure questa  parola dovrebbe  essere al
maschile) ma mi suonava male il prof che esigeva "il password".
Per la cronaca,  non ero serissimo, tanto è vero  che ho cominciato la
frase con  ocio. Solo che  non ho trovato  un emoticon adatto  (non ci
sono per tutto :) ).


 writes:
C> Devi metterlo dentro al primo while!
Se la mette nel while sai che botti a runtime :)...


 maschile) ma mi suonava male il prof che esigeva "il password".
No, IL password no! :-D
Ciao
Marco 

> al maschile) ma mi suonava male il prof che esigeva "il password".
n> No, IL password no! :-D
Ecco,  vedo che  mi comprendi.  Tutti  i sorgenti  della procedura  di
iscrizione sul 3B2 mi dovetti smazzare e correggere :) :) :) 


 iscrizione sul 3B2 mi dovetti smazzare e correggere :) :) :)
Qui non è più questione di giusto o sbagliato grammaticalmente.
Qui è proprio indecente!!! :-D
Ciao
Marco 

 Se la mette nel while sai che botti a runtime :)...
Ma va la'!?!?
while(true){
    System.out.println("\nIn attesa di una client call...");
    Socket socket = sSocket.accept();
    // tutta la roba di elaborazione, comunicazione, ecc
    socket.close();
}
Dove sono i botti?
Saluti
CarMas

> iscrizione sul 3B2 mi dovetti smazzare e correggere :) :) :)
n> Qui non è più questione di giusto o sbagliato grammaticalmente.
No, purtroppo è grammaticalmente corretto. Devo ricontrollare a casa sul
cartaceo, ma i dizionari on line mi danno password come neutro...
n> Qui è proprio indecente!!! :-D
Si, per le orecchie è una tortura|


> Se la mette nel while sai che botti a runtime :)...
C> Dove sono i botti?
Hai dannatamente ragione, ho letto male il codice...


Il Wed, 18 Jan 2006 14:07:41 +0000, BenB_155 ha scritto:
Dunque, intanto grazie a tutti, poi, ho provato un po' come dicevate voi,
tutte le soluzioni ed ecco il risultato :
Allego i due esempi (solo i cambiamenti) :
1.- Prova
import java.net.*;
import java.util.*;
import java.io.*;
class server implements Runnable {
    Thread serverThread;
    ServerSocket sSocket;
    Socket socket;               <---------- PRIMO CAMBIAMENTO
 
 
    public void run() {
 
		... come prima ...
 
	try{
	    sSocket = new ServerSocket(PORT);
 
			... come prima ...
	    while(true){
		System.out.println("\nIn attesa di una client call...");
		socket = sSocket.accept();             <----------- CAMBIAMENTO
 
		... come prima ...
 
		while(true){
 
		    ...come prima ...
		}
 
		//socket.close();
	    }
 
	    socket.close();
 
	} catch(IOException e) {
	    System.out.println(e);
	}
    }
}
RISULTATO :
server.java:98: unreachable statement
            socket.close();
            ^
Con tutti i vostri consigli, che ho seguito, ottengo sempre questo errore...
Cosa ne pensate..??
Salve e grazie ancora a tutti.
Ha ho provato a fare il socket.close() dentro il primo ciclo while,
niente, sempre solito errore... mha...
Sera a tutti e grazie di nuovo
BenB
 

 Cosa ne pensate..??
Che, come ti ho detto nella prima risposta, dal ciclo while(true) piu' 
interno non ne esci piu', almeno per quello che si puo' ricavare dal 
codice postato, e quindi tutti gli statement successivi sono 
naturalmente irraggiungibili!
Saluti
CarMas