Errore java.io.eofexception

di il
5 risposte

Errore java.io.eofexception

Salve, ho un problema di comunicazione stra client e server. E' il gioco del lotto, si chiedono ruota, numeri da giocare e cosa giocare tra ambo, terno ecc ecc. Riescono a connettersi ma alla fine, dopo aver inserito tutto, compare il messaggio di errore java.io.eofexception
Non leggo la risposta dal server. Come mai?
Lato Client
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

import javax.swing.JOptionPane;

public class LottoClient 
{
    ObjectInputStream Sinput;    // legge il socket
    ObjectOutputStream Soutput;  // scrive il socket
    Socket socket;
    
    String ruota;   //dichiaro le variabili
    String giocata;
    int dimensione_array;
    //int[] numeri_da_giocare;
    String[] dati;
    
    
     LottoClient(int port) 
    {
        try 
        {
            socket = new Socket("localhost", port);
        }
        catch(Exception e) 
        {
            System.out.println("Errore di connessione con il server:" + e);
            return;
        }
        System.out.println("Connessione accettata " +
                socket.getInetAddress() + ":" +
                socket.getPort());
        try
        {
            Sinput  = new ObjectInputStream(socket.getInputStream());
            Soutput = new ObjectOutputStream(socket.getOutputStream());
        }
        catch (IOException e) 
        {
            System.out.println("Exception crea nuovo flusso Input/output: " + e);
            return;
        }
        
        //ho la connessione e chiedo all'utente cosa vuole giocare 
               
        giocata = JOptionPane.showInputDialog ( "Scegli cosa giocare tra ambo, terno, quaterna, cinquina:" );       
        
        switch (giocata) 
        {
			case "ambo":
			dimensione_array = 3;
			dati = new String[dimensione_array];
			break;
			
			case "terno":
			dimensione_array = 4;
			dati = new String[dimensione_array];
			break;
				
			case "quaterna":
			dimensione_array = 5;
			dati = new String[dimensione_array];
			break;
			
			case "cinquina":
			dimensione_array = 6;
			dati = new String[dimensione_array];
			break;
				
			default:
			break;
		}
        //chiedo all'utente su quale ruota vuole giocare
        ruota = JOptionPane.showInputDialog ( "Su quale ruota vuoi effettuare la giocata?" );
        dati[0] = ruota;
        
        for (int i = 1; i < dimensione_array; i++) 
        {
        	dati[i] = JOptionPane.showInputDialog ( "Inserisci il numero da giocare:" );
		}       
        
        //invia la stringa al server
        try 
        {
            Soutput.writeObject(dati);            
            Soutput.flush();
        }
        catch(IOException e) 
        {
            System.out.println("Errore di scrittura nel socket: " + e);
            return;
        }
        
        //legge la stringa dal server
        String risultato;
        try 
        {
            risultato = (String) Sinput.readObject();
            System.out.println("Esito estrazione: " + risultato);
        }
        catch(Exception e) 
        {
            System.out.println("Problema lettura risposta dal server: " + e);
        }
        try
        {
            Sinput.close();
            Soutput.close();
        }
        catch(Exception e) {}
    }  
    
    //avvia il server sulla porta specificata
    public static void main(String[] arg) 
    {
        new LottoClient(2600);
    }
}
Lato Server
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;

public class LottoServer 
{
    private ServerSocket serverSocket;
    
    LottoServer(int port) 
    {
       //crea il socket server ed attende che venga richiesta una connessione
        try 
        {
            serverSocket = new ServerSocket(port);
            System.out.println("Server in attesa..." + serverSocket.getLocalPort());
            while (true) 
            {
                Socket socket = serverSocket.accept(); //accetta la connessione
                System.out.println("Un nuovo client ha chiesto la connessione");
                TcpThread t = new TcpThread(socket);    //crea un thread
                System.out.println("Inizia un thread per un nuovo client");
                t.start();
            }
        } 
        catch (IOException ex) 
        {
            System.out.println("Exception per il ServerSocket " + ex);
        }
    }
    
    public static void main(String[] arg) 
    {
        new LottoServer(2600);
    }
    
    class TcpThread extends Thread 
    {
        Socket socket;
        ObjectInputStream Sinput;
        ObjectOutputStream Soutput;
        TcpThread(Socket socket) 
        {
            this.socket = socket;
        }
        
        public void run() 
        {
            System.out.println("Thread prova a creare un object Input/Output");
            try 
            {
                Soutput = new ObjectOutputStream(socket.getOutputStream());
                Soutput.flush();
                Sinput = new ObjectInputStream(socket.getInputStream());
            } 
            catch (IOException e) 
            {
                System.out.println("Exception" + e);
            return;
            }
            
            System.out.println("Thread attende una stringa dal client");
            
            //il server riceve la stringa per la ruota e l'array di interi
            try 
            {
            	//dati presi dal client
            	String[] dati = (String[])Sinput.readObject();
            	int dimensione_array = dati.length;
            	
            	String ruota_da_giocare = dati[0];
            	int[] numeri_da_giocare = new int[dimensione_array];
            	
            	for (int i = 1; i < dimensione_array; i++) 
            	{
					numeri_da_giocare[i] = Integer.parseInt(dati[i]);
				}
                
            	//genera le ruote del lotto con i relativi numeri estratti
            	String ruote[] = new String[11];        		
        		ruote[0] ="Bari";
        		ruote[1] ="Cagliari";
        		ruote[2] ="Firenze";
        		ruote[3] ="Genova";
        		ruote[4] ="Milano";
        		ruote[5] ="Napoli";
        		ruote[6] ="Palermo";
        		ruote[7] ="Roma";
        		ruote[8] ="Torino";
        		ruote[9] ="Venezia";
        		ruote[10] ="Nazionale";	
        		
        		for (String s: ruote)
        	    {        		
        		   //Dichiaro l'array di interi da 90 numeri
        		   ArrayList<Integer> numbers = new ArrayList<Integer>();   
        		   for(int i = 0; i < 90; i++)   
        			{
        				//aggiungo i 90 numeri all'array in ordine crescente
        				numbers.add(i+1);   
        			}   
        			
        			//mischio i numeri in ordine casuale
        			Collections.shuffle(numbers);
        			
        			//eseguo il confronto
        			if(s.equals(ruota_da_giocare))
        			{
        				//confronto per vedere se ho vinto
        				int[] numeri_della_ruota = new int[5];
        				for(int j=0; j<5; j++)
        				{
        					numeri_della_ruota[j] = numbers.get(j);
        			        }
        			}					
        			        			
        			
        	    }
            } 
            catch (IOException  e) 
            {
                 System .out.println("Exception lettura/ scrittura: " + e);
                 return;
            }
            catch (ClassNotFoundException o) 
        	{ }
            finally 
            {
                try 
                {
                        Soutput.close();
                        Sinput.close();
                }
                catch (Exception e) 
                {                                       
                }
            }
        }
    }
}

5 Risposte

  • Re: Errore java.io.eofexception

    movida ha scritto:


    Non leggo la risposta dal server. Come mai?
    Perché il server non manda alcuna risposta!

    Dopo il

    //dati presi dal client
    String[] dati = (String[])Sinput.readObject();

    non fai nulla su Soutput (a parte il close nel finally)
  • Re: Errore java.io.eofexception

    Hai ragione modificato il codice. Ora funziona ma sul lato client resta "Connessione accettata localhost ecc ecc"
    Sul lato serve pubblica i numeri usciti e resta anche lì il trattino lampeggiante. Dove sbaglio? Non dovrebbe chiudersi la connessione?

    Lato Server
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;
    import java.util.Collections;
    
    public class LottoServer 
    {
        private ServerSocket serverSocket;
        
        LottoServer(int port) 
        {
           //crea il socket server ed attende che venga richiesta una connessione
            try 
            {
                serverSocket = new ServerSocket(port);
                System.out.println("Server in attesa..." + serverSocket.getLocalPort());
                while (true) 
                {
                    Socket socket = serverSocket.accept(); //accetta la connessione
                    System.out.println("Un nuovo client ha chiesto la connessione");
                    TcpThread t = new TcpThread(socket);    //crea un thread
                    System.out.println("Inizia un thread per un nuovo client");
                    t.start();
                }
            } 
            catch (IOException ex) 
            {
                System.out.println("Exception per il ServerSocket " + ex);
            }
        }
        
        public static void main(String[] arg) 
        {
            new LottoServer(2600);
        }
        
        class TcpThread extends Thread 
        {
            Socket socket;
            ObjectInputStream Sinput;
            ObjectOutputStream Soutput;
            TcpThread(Socket socket) 
            {
                this.socket = socket;
            }
            
            public void run() 
            {
                System.out.println("Thread prova a creare un object Input/Output");
                try 
                {
                    Soutput = new ObjectOutputStream(socket.getOutputStream());
                    Soutput.flush();
                    Sinput = new ObjectInputStream(socket.getInputStream());
                } 
                catch (IOException e) 
                {
                    System.out.println("Exception" + e);
                return;
                }
                
                System.out.println("Thread attende una stringa dal client");
                
                //il server riceve la stringa per la ruota e l'array di interi
                try 
                {
                	//dati presi dal client
                	String[] dati = (String[])Sinput.readObject();
                	int dimensione_array = dati.length;
                	
                	String ruota_da_giocare = dati[0];
                	int[] numeri_da_giocare = new int[dimensione_array];
                	
                	for (int i = 1; i < dimensione_array; i++) 
                	{
    					numeri_da_giocare[i] = Integer.parseInt(dati[i]);
    				}
                    
                	//genera le ruote del lotto con i relativi numeri estratti
                	String ruote[] = new String[11];        		
            		ruote[0] ="Bari";
            		ruote[1] ="Cagliari";
            		ruote[2] ="Firenze";
            		ruote[3] ="Genova";
            		ruote[4] ="Milano";
            		ruote[5] ="Napoli";
            		ruote[6] ="Palermo";
            		ruote[7] ="Roma";
            		ruote[8] ="Torino";
            		ruote[9] ="Venezia";
            		ruote[10] ="Nazionale";	
            		
            		for (String s: ruote)
            	    {        		
            		   //Dichiaro l'array di interi da 90 numeri
            		   ArrayList<Integer> numbers = new ArrayList<Integer>();   
            		   for(int i = 0; i < 90; i++)   
            			{
            				//aggiungo i 90 numeri all'array in ordine crescente
            				numbers.add(i+1);   
            			}   
            			
            			//mischio i numeri in ordine casuale
            			Collections.shuffle(numbers);
            			
            			//eseguo il confronto
            			if(s.equals(ruota_da_giocare))
            			{
            				//confronto per vedere se ho vinto
            				int[] numeri_della_ruota = new int[5];
            				for(int j=0; j<5; j++)
            				{
            					numeri_della_ruota[j] = numbers.get(j);
            			        }
            			}					
            			
            			System.out.print(s+": ");     
            			for(int j =0; j < 5; j++)     
            			{    
            				if(j==4)
            				{
            					System.out.println(numbers.get(j) + " ");
            				}
            				else
            				{
            					System.out.print(numbers.get(j) + " ");
            				}
            								
            			}        			
            			
            	    }            	
                	
                	String str = (String) Sinput.readObject();               
                    System.out.println(str);
                    
                    str = str.toUpperCase();
                    Soutput.writeObject(str);
                    Soutput.flush();        			
            			
            	    
                } 
                catch (IOException  e) 
                {
                     System .out.println("Exception lettura/ scrittura: " + e);
                     return;
                }
                catch (ClassNotFoundException o) 
            	{ }
                finally 
                {
                    try 
                    {
                            Soutput.close();
                            Sinput.close();
                    }
                    catch (Exception e) 
                    {                                       
                    }
                }
            }
        }
    }
    
  • Re: Errore java.io.eofexception

    movida ha scritto:


    Sul lato serve pubblica i numeri usciti e resta anche lì il trattino lampeggiante. Dove sbaglio? Non dovrebbe chiudersi la connessione?
    Non ho provato il tuo codice ma il run() del thread termina sicuramente ed è anche certo che i close li fai essendo in un finally (non è comunque buono che siano entrambi nel try, se il primo close fallisce, il secondo close non lo fai).

    Ma la applicazione server NON termina, c'è il loop della accept nel costruttore (che tra l'altro non è affatto bello/buono farlo appunto nel costruttore) che è continuo.
  • Re: Errore java.io.eofexception

    Rieccomi. Dopo vari tentantivi più o meno funziona tutto. O meglio, sul pc non ci sono problemi. Poi devo provare il tutto sul sito datomi dal professore e lì ci sono problemi. In particolare mi dice "invalid stream header java 5353482D".
    Siccome devo connettermi ad un certo indirizzo sulla porta 22 e per questo sito ho user e password, non capisco come fare. Cioè mettendo direttamente ip e porta sul lato client mi compare questo errore. Incollo il codice lato client.
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.Socket;
    
    import javax.swing.JOptionPane;
    
    public class LottoClient
    {
        ObjectInputStream Sinput;    // legge il socket
        ObjectOutputStream Soutput;  // scrive il socket
        Socket socket;
    
        String ruota;   //dichiaro le variabili
        String giocata;
        int dimensione_array;
        //int[] numeri_da_giocare;
        String[] dati;
    
    
         LottoClient(int port)
        {
            try
            {
                socket = new Socket("95.110.230.165", port);
            }
            catch(Exception e)
            {
                System.out.println("Errore di connessione con il server:" + e);
                return;
            }
            System.out.println("Connessione accettata " +
                    socket.getInetAddress() + ":" +
                    socket.getPort());
            try
            {
                Sinput  = new ObjectInputStream(socket.getInputStream());
                Soutput = new ObjectOutputStream(socket.getOutputStream());
            }
            catch (IOException e)
            {
                System.out.println("Nessuna connessione di input/output " + e);
                return;
            }
    
            //Ho stabilito la connessione e chiedo all'utente cosa vuole giocare
    
            giocata = JOptionPane.showInputDialog ( "Scegli cosa giocare tra ambo, terno, quaterna, cinquina:" );
    
            switch (giocata)
            {
    			case "ambo":
    			dimensione_array = 3;
    			dati = new String[dimensione_array];
    			break;
    
    			case "terno":
    			dimensione_array = 4;
    			dati = new String[dimensione_array];
    			break;
    
    			case "quaterna":
    			dimensione_array = 5;
    			dati = new String[dimensione_array];
    			break;
    
    			case "cinquina":
    			dimensione_array = 6;
    			dati = new String[dimensione_array];
    			break;
    
    			default:
    			break;
    		}
            //chiedo all'utente su quale ruota vuole giocare
            ruota = JOptionPane.showInputDialog ( "Su quale ruota vuoi effettuare la giocata?" );
            dati[0] = ruota;
    
            for (int i = 1; i < dimensione_array; i++)
            {
            	dati[i] = JOptionPane.showInputDialog ( "Inserisci il numero da giocare:" );
    		}
    
    
            //invia la stringa al server
            try
            {
                Soutput.writeObject(dati);
                Soutput.flush();
            }
            catch(IOException e)
            {
                System.out.println("Errore di scrittura nel socket: " + e);
                return;
            }
    
            //legge la stringa dal server
            String risultato;
            try
            {
                risultato = (String) Sinput.readObject();
                System.out.println("Esito estrazione: " + risultato);
            }
            catch(Exception e)
            {
                System.out.println("Problema lettura risposta dal server: " + e);
            }
            try
            {
                Sinput.close();
                Soutput.close();
            }
            catch(Exception e) {}
        }
    
        //avvia il server sulla porta specificata
        public static void main(String[] arg)
        {
            new LottoClient(22);
        }
    
    }
    
  • Re: Errore java.io.eofexception

    movida ha scritto:


    Rieccomi. Dopo vari tentantivi più o meno funziona tutto. O meglio, sul pc non ci sono problemi. Poi devo provare il tutto sul sito datomi dal professore e lì ci sono problemi. In particolare mi dice "invalid stream header java 5353482D".
    Siccome devo connettermi ad un certo indirizzo sulla porta 22 e per questo sito ho user e password, non capisco come fare.
    5353482D sono gli hex della stringa SSH- e quindi viene subito da pensare che NON è il tuo programmino che deve connettersi a quel host/porta ma devi aprire una shell su quel sistema usando appunto SSH. Poi una volta che hai il prompt dei comandi su quel sistema, cosa ci dovrai/potrai fare .... non ne ho idea.

    Dovresti aver ricevuto indicazioni più precise, se non le hai comprese o nemmeno ricevute, hai un piccolo problema in più.
Devi accedere o registrarti per scrivere nel forum
5 risposte