separazione dichiarazione-utlilizzo variabili alla C

Stato
Discussione chiusa ad ulteriori risposte.

void

Utente Silver
9 Agosto 2008
10
5
0
63
Ciao a tutti,

ho questo client semplicissimo

Codice:
import java.io.*;
import java.net.*;

public class client {
    public static void main(String[] args) throws IOException {  
        Socket client = new Socket("127.0.0.1", 2727);
        
        PrintWriter os = new PrintWriter(client.getOutputStream(), true);
        BufferedReader   is = new BufferedReader(new InputStreamReader(client.getInputStream()));
        
        System.out.println(is.readLine());
        os.println("Ciao server\n");
        
        is.close();
        os.close();
        client.close();
    }
}

vorrei modificarlo in una cosa tipo:

Codice:
import java.io.*;
import java.net.*;

public class client {
    private Socket client = new Socket ecc...
    private  PrintWriter os = ecc
    
    
    public static void main(String[] args) throws IOException {
        client = new Socket("127.0.0.1", 2707);
        
        PrintWriter os = new PrintWriter(client.getOutputStream(), true);
        BufferedReader   is = new BufferedReader(new InputStreamReader(client.getInputStream()));
        
        System.out.println(is.readLine());
        os.println("client: messaggio dal client");
        
        is.close();
        os.close();
        client.close();
    }
}


con dichiarazione delle variabili all'esterno del main... e poi le utilizzo all'interno del main...

questo mi serve perchè vorrei non chiamare la funzione client = new Socket("127.0.0.1", 2707);

nella dichiarazione ....

come posso fare?
 
[ot]scusa off topic ma
io non ci capisco nulla........
sono ancora a readline e read() :asd:
potresti provare cosi:
Codice:
String ip = "127.0.0.1";
int port = 2707;
client = new Socket( ip , port );
[/ot]
 
kripnos ha detto:
[ot]scusa off topic ma
io non ci capisco nulla........
sono ancora a readline e read() :asd:
potresti provare cosi:
Codice:
String ip = "127.0.0.1";
int port = 2707;
client = new Socket( ip , port );
[/ot]

hehehee non ci siamo.. la fuzione Socket riceve come parametri un tipo ipaddress e un int...

R4z0r_Cr4$H ha detto:
o nel main o fuori dal main che ti cambia?non capisco...

cambia... perchè non voglio chiamare la connect nel momento della dichiarazione della Socket

questa riga
Socket client = new Socket("127.0.0.1", 2707);

mi fa connettere al server e contemporaneamente dichiara una Socket client...

se volessi infilarla in un while(true) tipo cosi'

while(true){
Socket client = new Socket("127.0.0.1", 2707);
if(connesso){break;}
}

non lo posso fare...mi dà errore... :confused:
 
prova a mettere anche in un try-catch!Il metodo main ha " throws IOException" ossia una eccezione di I/O...quindi con un try-catch dovrebbe andare!
 
Non puoi assolutamente costruire o inizializzare un oggetto al di fuori del costruttore della classe o di un suo metodo in Java. Questo perché Java è un linguaggio estremamente class-oriented, dove gli attributi di una classe e le azioni compiute su di essi (ergo inizializzazioni, costruzioni ecc.) sono eventi tenuti ben separati, e se inizializzi un oggetto al di fuori del costruttore o dei metodi della classe la virtual machine non saprebbe semplicemente in che momento effettuare quell'operazione.
 
vabbè fuori dal metodo,nella classe,potrebbe dichiararlo senza inizializzarlo e poi farlo dove gli serve...tipo:
Codice:
public class Esempio{
  private Socket client;
  public Esempio(){
    try{
       client=new Socket("127.0.0.1", 2707);
    }catch(IOException e){}
  }
}
 
Si appunto, io mi riferivo all'inizializzazione e costruzione di oggetti al di fuori di un metodo qualsiasi della classe o del costruttore della classe...è quella che è vietata per la logica stessa di Java, poi è normale che in un metodo o in un costruttore posso farci quello che voglio...sono fatti apposta :D
 
ho capito cosa dite... ma allora come caspita si potrebbe fare a ciclizzare la funzione di connessione???
vorrei che il client andasse ogni tot secondi a chiamare la funzione di connessione ed appena connesso deve uscire dal ciclo... come è possibile che in java non si possa fare? ho provato un po' di soluzioni,ma non ne sono uscito..... ah cmq W il C :)
 
si la genera... non ti sbagli ,ho provato....

cmq non esiste un modo per creare un client che ogni tot cerca di connettersi al server?? ma quanti paletti sto java :-o

ma mica è un operazione dannosa... bah
 
scusa...xkè dovresti connetterti ogni tot al server?una volta che crei il socket e si connette xkè dovresti riconnetterti?
 
Usa due thread paralleli no? Uno effettua la connessione, l'altro rimane in sleep per un tot di secondi e al termine dello sleep manda un kill all'altro thread per poi riaprire il socket, e così via quante volte vuoi in un ciclo..

Anche se non ho capito di preciso a cosa ti riferisci...questa è una soluzione un po' macchinosa ma all-purpose, ma tu di tuo cosa vuoi fare? Gestione del timeout su socket? Bombing? Controllo della connessione andata a buon fine?
 
perchè il server non è sempre in esecuzione... quindi dal lato server si puo' aspettare all'infinito fichè il client non viene eseguito.... ma dal lato client no...
vorrei che anche il client potesse aspettare fichè il server non viene attivato... cmq con le socket di windows in c l'ho sempre fatto sfruttando i vari socket error.... è impossibile che questa "operazione" non si possa fare in java... dopo provo a fare una cosa del genere
Codice:
while(true){
try{
cout<<"provo la connessione\n";
Socket c = new Socket("127.0.0.1",2020);
stringa=riceviPassword
if(stringa=="pw"){break;}
}catch(eccezione){
cout<<"riprovo\n";
 c = new Socket("127.0.0.1",2020);
stringa=riceviPassword
if(stringa=="pw"){break;}
}
}
dove faccio in modo che alla prima connessione il server invia una stringa (protocollo a livello di applicazione) per farsi riconoscere e per permettere al client di uscire dal while(true)

boh... le idee ci sono ,ma java mette i paletti
 
Non so dove li vedi questi paletti...in Java, se è quello che vuoi fare, puoi tranquillamente richiamare la connect con due parametri, dove il secondo è un intero che rappresenta il timeout. Con un timeout == 0 setti il timeout infinito, quindi il client rimarrebbe in ascolto finché la connessione non va a buon fine. Anche l'idea dell'ACK da parte del server ovviamente è fattibile, anche perché le read su socket sono bloccanti, ma forse non è il caso di complicarsi la vita se in Java puoi tranquillamente impostare una connessione fin dall'inizio con timeout infinito..
 
io se fossi in te o userei i thread o creerei un metodo connetti dove nel try-catch prova la connessione,se genera l'eccezione ritorna false altrimenti true,poi a parte richiamando il metodo connetti ti gestisci ogni quanto richiamare il metodo connetti!
 
x black---ti sbagli... il timeout non viene considerato....ho già provato...
è probabile che la variabile timeout non indichi il tempo di attesa di connessione da parte del client ma indichi il tempo di completamento del handshake a 3 vie... cmq tutto testato,non va...

x razor--si ma se in un metodo connetti ci metti la fuzione connect sei costretto a chiuderla in un try-catch... cosa che comporta la fine del metodo nel momento in cui la connect finisce nel catch (dopo che ha capito che il server è offline) :-((((
 
l'oggetto socket lo devi mettere sempre e comunque in un try-catch,tu utilizzando un metodo che attiva la socket (che però la dichiari fuori dal metodo) se si connette resta attiva e utilizzabile dall'intera classe.
 
ma io devo ciclizzare l'operazione di connessione finchè il server non viene attivato e quindi finchè client e server non si connettono... non so se hai provato,cmq c'è per forza bisogno di un While(true) o while(qualche cosa) ...
il problema che ho osservato è che se inserisco il blocco try-catch in un while(true) si ha l'eccezzione (e fin qui ci siamo) e poi non viene rispettato il while,nel senso che non c'è ritorno indietro....rimane nel cath... ma che caxxo....
 
forse non mi sono spiegato:
Codice:
public class Prova{
  Socket socket;
  boolean b=false;
  public Prova(){
    do{
      b=connetti("127.0.0.1",1234);
    }while(b==true);
  }
  public boolean connetti(String ind,int port){
   try{
      socket=new Socket(ind,port);
      return true;
   }catch(Exception e){
      return false;
  }
 }
}
in base al valore booleano che connetti ti ritorna cicli con il do-while e non con il while semplice....dato che prima devi tentare la connessione!
 
ho capito cosa vuoi dire ,ma non compila

Codice:
import java.io.*;
import java.net.*;

public class client {
       Socket socket;
      boolean b=false;
       
       public client(){
    do{
      b=connetti("127.0.0.1",1234);
    }while(b==true);
  
      
      
      public boolean connetti(String ind,int port){
   try{
      socket =new Socket(ind,port);
      return true;
   }catch(IOException e){
      return false;
  }
  }
    
    public static void main(String[] args)throws IOException  {        
 
               client c = new client();
                System.out.println("Connesso!!\n");
        PrintWriter os = new PrintWriter(client.getOutputStream(), true);
        BufferedReader   is = new BufferedReader(new InputStreamReader(client.getInputStream()));
       
       
        System.out.println(is.readLine());
        os.println("client: messaggio dal client");
        
        is.close();
        os.close();
        client.close();
    }
}
 
cosa vuoi dire con questo? che non si puo' fare ? :-O heeheh
cmq programmo da un mese... uso un compilatore di pietro gofy,cosa cambia?
 
Stato
Discussione chiusa ad ulteriori risposte.