Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    11

    [socket java] Non riesco a creare un client che invii più di un messaggio

    Buonasera a tutti, sto studiando i socket per l'università e sto cercando di esercitarmi ma con scarsi risultati.

    Tutti gli esempi che ho trovato online lavorano con client e server che dopo aver inviato un solo messaggio effettuano una close().
    Non riesco a capire come creare una socket con client e server che comunicano e scambiano diversi messaggi.
    Ho provato a svolgere un esercizio e ci ho sbattuto la testa per giorni senza trovare la soluzione.. Qualcuno saprebbe dirmi cosa sbaglio?
    Grazie

    CLIENT

    codice:
    /*Scrivere in C o Java un programma che:apra una connessione verso "hocalhost", port 4020
    invii la stringa "GET /gp/prova/11.aux\n"
    nello stream di byte ricevuti individui la prima parentesi quadra aperta
    memorizzi tutti i successivi byte fino alla prima parentesi quadra chiusa, che il server invierà, in una variabile stringa denominata "s"
    riaperta la connessione, invii la stringa s (attenzione: dovrebbe terminare per "\n")
    scriva i byte ricevuti in risposta sulla standard output*/
    
    
    // Client
    
    
    import java.io.*;
    import java.net.*;
    
    
    public class ClientSocket {	
    	String response="";
    	String messaggio = "GET /gp/prova/11.aux\n";
    	String s="";
    	
    	boolean inviato = false;
    	boolean salvato = false;
    	
    	
     public void run() {
    	try {
    		while(true){
    			int serverPort = 4020;
    			InetAddress host = InetAddress.getByName("localhost"); 
    			System.out.println("Connecting to server on port " + serverPort); 
    
    
    			Socket socket = new Socket(host,serverPort); //creo la socket con localhost, porta 4020
    			//Socket socket = new Socket("127.0.0.1", serverPort);
    			System.out.println("Just connected to " + socket.getRemoteSocketAddress()); 
    			PrintWriter toServer = 				//inizializzo stream di output
    				new PrintWriter(socket.getOutputStream(),true);
    			BufferedReader fromServer = 			//inizializzo stream di input
    				new BufferedReader( new InputStreamReader(socket.getInputStream()));
    			
    			if(!inviato){//se non ha ancora inviato la prima stringa dell'esercizio la invia
    				toServer.println(messaggio); 
    				inviato = true;		//setta inviato a true in modo tale da inviarla una sola volta
    				String line = fromServer.readLine();
    				System.out.println("Client received: " + line + " from Server"); //stampa cosa risponde il server
    				response = line;
    			}
    			
    			
    		
    			if(inviato == true && salvato == false){//se ho già inviato la stringa dell'esercizio e non ho ancora analizzato la risposta
    				for(int i=0; i<response.length(); i++){ //scorro la risposta del server
    					if(response.charAt(i) == '['){ //appena trovo una parentesi quadra salvo in s tutto il resto
    						for(int j=i+1; response.charAt(j) != ']'; j++){
    							s += response.charAt(j);
    							salvato = true;	//imposto salvato a true per evitare di ripetere   l'operazione al prossimo ciclo
    						}
    					}
    				}
    			}
    			
    			if(salvato == true){		//se ho già salvato lo stream in s, invio s al server.
    				s+="\n";	
    				toServer.println(s);		//ma questa print non funziona... 
    				System.out.println("Inviato: "+s);
    				
    				String line = fromServer.readLine();	//aspetto conferma dal server
    				System.out.println("Client received: " + line + " from Server");
    				
    				if(line.equals("Esame superato")){		//se corretta chiudo stream e socket
    					toServer.close();
    					fromServer.close();
    					socket.close();
    				}else{														//se errata ripeto la procedura
    					inviato = false;
    					salvato = false;
    				}
    				
    				
    			}
    		}
    	}
    	
    	catch(UnknownHostException ex) {
    		ex.printStackTrace();
    	}
    	catch(IOException e){
    		e.printStackTrace();
    	}
      }
    	
      public static void main(String[] args) {
    		ClientSocket client = new ClientSocket();
    		client.run();
      }
    }


    SERVER

    codice:
    /*Scrivere in C o Java un programma che:apra una connessione verso "localhost", port 4020
    invii la stringa "GET /gp/prova/11.aux\n"
    nello stream di byte ricevuti individui la prima parentesi quadra aperta
    memorizzi tutti i successivi byte fino alla prima parentesi quadra chiusa, che il server invierà, in una variabile stringa denominata "s"
    riaperta la connessione, invii la stringa s (attenzione: dovrebbe terminare per "\n")
    scriva i byte ricevuti in risposta sulla standard output*/
    
    
    // Server Side
    import java.net.*;
    import java.io.*;
    
    
    public class ServerSideSocket { 
      boolean inviato = false;	
    	
      public void run() {
    	try {
    		int serverPort = 4020;
    		ServerSocket serverSocket = new ServerSocket(serverPort);	//inizializzo serversocket con porta 4020
    		serverSocket.setSoTimeout(10000); 		
    		while(true) {
    			System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "..."); 
    
    
    			Socket server = serverSocket.accept();	//attendo connessioni
    			System.out.println("Just connected to " + server.getRemoteSocketAddress()); 
    
    
    			PrintWriter toClient = 				//inizializzo stream di output
    				new PrintWriter(server.getOutputStream(),true);
    			BufferedReader fromClient =			//inizializzo stream di input
    				new BufferedReader(
    						new InputStreamReader(server.getInputStream()));
    			String line = fromClient.readLine();	 //leggo messaggio del client
    			System.out.println("Server received: " + line); 
    			if(!inviato){		//se non ho ancora inviato la stringa di risposta la invio
    				toClient.println("aadsnaskdfhga[piccolastellasenzacielo]caosonosiadsjakjfbhbhs"); 
    				inviato = true;
    			}
    			
    			if(line.equals("piccolastellasenzacielo")){ //controllo se il client mi ha inviato la stringa che mi aspettavo
    				
    				toClient.println("Esame superato\n"); 	//comunico al client che la stringa è corretta
    				System.out.println("Esame superato");
    			
    			}
    		}
    	}
    	catch(UnknownHostException ex) {
    		ex.printStackTrace();
    	}
    	catch(IOException e){
    		e.printStackTrace();
    	}
      }
    	
      public static void main(String[] args) {
    		ServerSideSocket srv = new ServerSideSocket();
    		srv.run();
      }
    }

    Spero di aver commentato bene il codice.
    Grazie ancora

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,323
    Sposto nel forum "Java".

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    11
    Grazie

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,323
    Dovresti dire qual è il comportamento errato che ottieni, altrimenti è difficile andare in cerca di un problema che non si sa quale sia.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    11
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Dovresti dire qual è il comportamento errato che ottieni, altrimenti è difficile andare in cerca di un problema che non si sa quale sia.


    Ciao.
    Si, hai ragione! Pensavo fosse chiaro nei commenti.
    Dopo aver inviato al server il messaggio che l'esercizio richiede ed aver ricevuto la risposta, non riesco a riinviare nulla al server...
    Ho provato in tutti i modi. Non capisco come effettuare una seconda print.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da jeydiz Visualizza il messaggio
    Non riesco a capire come creare una socket con client e server che comunicano e scambiano diversi messaggi.
    Ho provato a svolgere un esercizio e ci ho sbattuto la testa per giorni senza trovare la soluzione.. Qualcuno saprebbe dirmi cosa sbaglio?
    Innanzitutto il server che hai realizzato si definisce "sequenziale" (o detto "iterativo"), perché serve un solo client per volta uno dopo l'altro in sequenza. Non va ovviamente bene se la comunicazione, in generale, deve essere "lunga" e fatta da più client.
    In tal caso servirebbe il multi-threading sul lato server (con tutto quello che comporta).

    Poi la questione del gestire più "messaggi" durante una singola comunicazione ... questa è solo questione del "protocollo" che ti inventi per portare avanti la comunicazione tra i due host. Ora stai facendo un solo fromClient.readLine(). Se vuoi gestirne di più, semplicemente gestisci "in loop" più messaggi finché il client non si sconnette e/o magari esplicitamente invia un comando "particolare" (es. una stringa QUIT).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    11
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Innanzitutto il server che hai realizzato si definisce "sequenziale" (o detto "iterativo"), perché serve un solo client per volta uno dopo l'altro in sequenza. Non va ovviamente bene se la comunicazione, in generale, deve essere "lunga" e fatta da più client.
    In tal caso servirebbe il multi-threading sul lato server (con tutto quello che comporta).

    Poi la questione del gestire più "messaggi" durante una singola comunicazione ... questa è solo questione del "protocollo" che ti inventi per portare avanti la comunicazione tra i due host. Ora stai facendo un solo fromClient.readLine(). Se vuoi gestirne di più, semplicemente gestisci "in loop" più messaggi finché il client non si sconnette e/o magari esplicitamente invia un comando "particolare" (es. una stringa QUIT).
    Ok grazie, per quanto riguarda il primo punto penso che un server sequenziale vada bene per il mio esercizio dato che uso un solo client. E' corretto?

    Per quanto riguarda il secondo immaginavo potesse essere questo il problema ma non capisco dove e come effettuare una nuova readLine().
    Dato che mando tutto in loop con while(true) la stessa fromClient.readLine() non dovrebbe leggere il secondo messaggio al secondo giro del loop?


    [edit] Ho messo un ulteriore while(true) fra "fromClient.readLine()" ed il resto della logica del programma e funziona.
    Grazie mille! Risolto.
    Ultima modifica di jeydiz; 07-10-2015 a 18:03

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da jeydiz Visualizza il messaggio
    [edit] Ho messo un ulteriore while(true) fra "fromClient.readLine()" ed il resto della logica del programma e funziona.
    Come prova è ok. Ma in realtà dovresti ciclare finché readLine non restituisce null (=end-of-stream, ovvero fine "fisica" della comunicazione)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    11
    Ho capito, grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.