Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2000
    Messaggi
    114

    [JAVA] Client-server. Scambio messaggi

    Ciao a tutti,
    ho 2 applicazioni(1 server e 1 client) e voglio che il server passi una stringa al client. Non so se ho fatto bene la scrittura della stream da parte del server (dateci una controllata), il mio problema e' come far leggere dalla stream il client??
    Faccio ancora molta confusione con ste cose....

    Grazie





    --------------- SERVER ----------------------
    codice:
    import java.io.*;
    import java.net.*;
    
    class SempliceServer{
    	
    	SempliceServer() throws IOException {
    		
    		ServerSocket Server = new ServerSocket(2000);
    		InetAddress IndirizzoServer = InetAddress.getLocalHost();
    		
    		System.out.println("\nSERVER - HOST: " + IndirizzoServer + " in ascolto sulla PORTA: " + Server.getLocalPort() + "\n");
    		
    		System.out.println("\nAttendo nuove connessioni....");	
    		Socket Client = Server.accept();
    		
    		System.out.println("\n\nSi è connesso l' HOST: " + Client.getInetAddress() + " alla PORTA: " + Client.getLocalPort());  
    		
    		/* CREAZIONE STREAM CON CLIENT */
    
    		InputStream Input = Client.getInputStream();
                    OutputStream Output = Client.getOutputStream();
    		PrintStream PrintStr = new PrintStream(Output);		
    	}
    
    /* METODO PER L'INVIO DI MESSAGGI AL CLIENT */
    	
    	public void InvioMessaggioClient() throws IOException{
    		
    		String InputLine = null;
    		System.out.println("\nInvia il messaggio: \n");
    	
    		/* PER PRENDERE UN INPUT DA TASTIERA */
    		BufferedReader br = new BufferedReader( new InputStreamReader(System.in) );
          	        InputLine = br.readLine();
          	
    		PrintStr.println(InputLine);	
    		
    	}
    	
    		
    }
    	
    public class server{
    	
    	public static void main(String args[]) throws IOException{
    	
    		SempliceServer Server = new SempliceServer();		
    		Server.InvioMessaggioClient();	
    		
    	}
    }



    -------------- CLIENT -----------------------
    codice:
    import java.io.*;
    import java.net.*;
    
    class SempliceClient{
    	
    	SempliceClient() throws IOException{
    		
    		InetAddress IndirizzoServer = InetAddress.getByName("192.168.0.1");
    		InetAddress IndirizzoClient = InetAddress.getLocalHost();
    		int porta = 2000;
    		
    		Socket Client = new Socket(IndirizzoServer,porta);
    		
    		System.out.println("\nCLIENT - HOST: " + IndirizzoClient + " PORTA: " + Client.getLocalPort() + "\n");		
    		System.out.println("\nMi sono connesso all' HOST: " + Client.getInetAddress() + " PORTA: " + Client.getPort());	
    		
    		
    
    		// LETTURA STREAM ???????????????????????
    	
    		
    	}
    
    }
    
    public class client{
    	
    	public static void main(String[]args) throws IOException{
    		
    		try{
    			SempliceClient Client = new SempliceClient();
    		}catch (IOException ex) {
    
            	ex.printStackTrace ();        
    
        	        }
    	}
    	
    }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Non c'è nulla di difficile o con cui fare confuzione: gli InputStream (come dice il nome) servono per leggere, mentre gli OutputStream (sempre come dice il nome) servono per scrivere.

    Allora... se la comunicazione avviene in modo unidirezionale, allora non ti serve un InputStream sul server, dato che, come hai richiesto nel post, devi inviare una stringa dal server al client.
    Quindi, sul server ti serve un OutputStream (il server, scrive) e sul client ti serve un InputStream (il client legge).

    A questo punto il tuo codice diventa questo:
    codice:
    import java.io.*;
    import java.net.*;
    
    class SempliceServer{
       SempliceServer() throws IOException {
          ServerSocket Server = new ServerSocket(2000);
          InetAddress IndirizzoServer = InetAddress.getLocalHost();
          System.out.println("\nSERVER - HOST: " + IndirizzoServer + " in ascolto sulla PORTA: " + Server.getLocalPort() + "\n");
          System.out.println("\nAttendo nuove connessioni....");	
          Socket Client = Server.accept();
          System.out.println("\n\nSi è connesso l' HOST: " + Client.getInetAddress() + " alla PORTA: " + Client.getLocalPort());  
    		
          /* CREAZIONE STREAM CON CLIENT */
          OutputStream Output = Client.getOutputStream();
          PrintStream PrintStr = new PrintStream(Output);		
       }
    
       /* METODO PER L'INVIO DI MESSAGGI AL CLIENT */
       public void InvioMessaggioClient() throws IOException{
          String InputLine = null;
          System.out.println("\nInvia il messaggio: \n");
    
          /* PER PRENDERE UN INPUT DA TASTIERA */
          BufferedReader br = new BufferedReader( new InputStreamReader(System.in) );
          InputLine = br.readLine();
          PrintStr.println(InputLine);	
       }
    }
    	
    public class server{
       public static void main(String args[]) throws IOException{
          SempliceServer Server = new SempliceServer();		
          Server.InvioMessaggioClient();	
       }
    }
    
    
    --------------------------------------------------------------------------------
    
    -------------- CLIENT ----------------------- 
    
    import java.io.*;
    import java.net.*;
    
    class SempliceClient{
       SempliceClient() throws IOException{
          InetAddress IndirizzoServer = InetAddress.getByName("192.168.0.1");
          InetAddress IndirizzoClient = InetAddress.getLocalHost();
          int porta = 2000;
          Socket Client = new Socket(IndirizzoServer,porta);
          System.out.println("\nCLIENT - HOST: " + IndirizzoClient + " PORTA: " + Client.getLocalPort() + "\n");
          System.out.println("\nMi sono connesso all' HOST: " + Client.getInetAddress() + " PORTA: " + Client.getPort());
          ObjectInputStream input = new ObjectInputStream ( Client.getInputStream() );
    
          // LETTURA STREAM ???????????????????????
          String messaggio = (String) input.readObject();
          System.out.println("Il server ha inviato questo messaggio:");
          System.out.println(messaggio);
       }
    }
    
    public class client{
       public static void main(String[]args) throws IOException{
          try{
             SempliceClient Client = new SempliceClient();
          }catch (IOException ex) {
             ex.printStackTrace ();        
          }
       }
    }
    Nota che ho utilizzato un ObjectInputStream, in quanto tu trasmetti un oggetto di tipo String sulla Socket, quindi dall'altra parte devo prepararmi a leggere degli oggetti.

    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
    Mar 2000
    Messaggi
    114
    Se uso la classe ObjectInputStream, per leggere un oggetto stringa dallo stream, posso usare per scrivere nello stream un oggetto stringa la classe ObjectOutpuStream. Giusto?

    Mi da un errore quando compilo il client e nn riesco a capire cosa sia:

    unreported exception java.lang.ClassNotFoundException; must be caught or declared to be thrown
    Ti posto i codici che ho riscritto:
    codice:
    ------------ server ----------------
    import java.io.*;
    import java.net.*;
    
    class SempliceServer{
       SempliceServer() throws IOException {
          ServerSocket Server = new ServerSocket(2000);
          InetAddress IndirizzoServer = InetAddress.getLocalHost();
          System.out.println("\nSERVER - HOST: " + IndirizzoServer + " in ascolto sulla PORTA: " + Server.getLocalPort() + "\n");
          System.out.println("\nAttendo nuove connessioni....");	
          Socket Client = Server.accept();
          System.out.println("\n\nSi è connesso l' HOST: " + Client.getInetAddress() + " alla PORTA: " + Client.getLocalPort());  
    		
          ObjectOutputStream output = new ObjectOutputStream ( Client.getOutputStream() );
          
          String InputLine = "Invio di questa stringa";
          System.out.println("\nSto inviando il messaggio \n");   
    
          output.writeObject(InputLine);
    	             	
          	
       }
             
    }
    	
    public class server{
       public static void main(String args[]) throws IOException{
          SempliceServer Server = new SempliceServer();			
       }
    }
    ----------------- client -------------
    codice:
    import java.io.*;
    import java.net.*;
    
    
    class SempliceClient{
       SempliceClient() throws IOException{
          
          
          InetAddress IndirizzoServer = InetAddress.getByName("192.168.1.1");
          InetAddress IndirizzoClient = InetAddress.getLocalHost();
          int porta = 2000;
          Socket Client = new Socket(IndirizzoServer,porta);
          System.out.println("\nCLIENT - HOST: " + IndirizzoClient + " PORTA: " + Client.getLocalPort() + "\n");
          System.out.println("\nMi sono connesso all' HOST: " + Client.getInetAddress() + " PORTA: " + Client.getPort());
          
          ObjectInputStream input = new ObjectInputStream ( Client.getInputStream() );  
          String messaggio = (String) input.readObject();
        
          System.out.println("Il server ha inviato questo messaggio:");
          System.out.println(messaggio);
           	
      }
    }
    
    public class client{
       public static void main(String[]args) throws IOException{
          try{
             SempliceClient Client = new SempliceClient();
          }catch (IOException ex) {
             ex.printStackTrace ();        
          }
       }
    }
    Grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2000
    Messaggi
    114
    Dimenticavo, l'errore lo segna per questa riga del client:

    String messaggio = (String) input.readObject();

    Grazie

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Non ho controllato, ma credo che usando gli ObjectInputStream e ObjectOutputStream sia necessario catturare anche un altro tipo di eccezione oltre all'IOException. Quindi, basta modificare la firma dei metodi, in questo modo:
    codice:
    SempliceServer() throws Exception {
      ...
    }
    
    -----------------------------------
    
    SempliceClient() throws Exception {
       ...
    }
    e catturare un'eccezione più generica nel try/catch:
    codice:
    try {
       ...
    } catch (Exception e) {...}
    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

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 © 2024 vBulletin Solutions, Inc. All rights reserved.