Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    0

    objectInputStream e EOFException

    Buona sera a tutti, ho un problema java che mi sta tormentando da questa mattina e ho davvero bisogno di aiuto per risolverlo.

    Il problema è rappresentato dall'invio di una classe mediante objectInputStream e objectOutputStream.

    Questa è la classe cliente
    codice:
    public class Cliente {
    
    
    	static int port = 6000;
    	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	public static void main(String[] args) {
    
    
    		Socket socket = null;
    		String str = null;
    		Pizza pizza = null;
    		
    		PrintStream ps;
    		ObjectInputStream ois;
    		
    		try {
    			socket = new Socket("localhost", port); //creo la socket
    			
    			ps = new PrintStream(socket.getOutputStream());
    			ois = new ObjectInputStream(socket.getInputStream());
    			
    			System.out.println("Benvenuto in pizzeria");
    			
    			do {
    				str = pizza(); //chiedo l'ordine
    				ps.print(str+"\r\n"); //invio sulla rete
    				ps.flush();
    				
    				try {
    					pizza = (Pizza)ois.readObject();
    					ois.close();
    					
    					System.out.println("Ho ricevuto una bella "+pizza.getType());
    				} catch (ClassNotFoundException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    				
    			}while(!str.equals("exit"));
    			
    			System.out.println("Arrivederci");
    			socket.close();
    				
    		} catch (UnknownHostException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    
    	public static String pizza() {
    		String str = null;
    		
    		System.out.println("Quante pizze vuoi?"); //stampo a video la richiesta
    		try {
    			str = br.readLine(); //leggo l'ordine
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		return str;
    	}
    }
    Alla riga "pizza = (Pizza)ois.readObject();" il client riceve dal server un oggetto di tipo stringa.

    L'oggetto di tipo stringa è così definito:
    codice:
    public class Pizza implements Serializable {
    
    
    	private static final long serialVersionUID = 1L;
    	String nome;
    	
    	public Pizza() {
    		 nome = "Margherita";
    	}
    	
    	public String getType() {
    		return nome;
    	}
    }

    E questo è il frammento della classe pizzaiolo responsabile dell'invio:
    codice:
    		try {
    			oos.writeObject(p);
    			oos.flush();
    			oos.close();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    Il problema è il seguente: il client arriva alla riga incriminata prima che il server abbia scritto qualcosa su canale, tuttavia immediatamente solleva questa eccezzione:

    java.io.EOFException
    at java.io.ObjectInputStream$BlockDataInputStream.pee kByte(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at Cliente.main(Cliente.java:39)

    Sapete dirmi da cosa può essere causata?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da pirro Visualizza il messaggio
    codice:
    			do {
    				str = pizza(); //chiedo l'ordine
    				ps.print(str+"\r\n"); //invio sulla rete
    				ps.flush();
    				
    				try {
    					pizza = (Pizza)ois.readObject();
    					ois.close();
    					
    					System.out.println("Ho ricevuto una bella "+pizza.getType());
    				} catch (ClassNotFoundException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    				
    			}while(!str.equals("exit"));
    Due cose saltano subito all'occhio:
    1) Se si inserisce "exit", l'invio sulla rete di questo potresti farlo o non farlo .... dipende se intendi far sapere al server della uscita o no, insomma, dipende da come intendi gestire la cosa lato server. Ma sicuramente il readObject non dovresti farlo se vuoi uscire!
    2) Se vuoi che il ciclo si ripeta (che chieda più volte quante pizze vuoi) allora quel ois.close(); lì in mezzo ovviamente non va bene.

    Tra l'altro, quale è il senso di chiedere quante pizze si vogliono se poi a fronte di tale richiesta te ne aspetti solo una?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    0
    Le tue considerazioni sono tutte corrette, solo che mi sono fermato nell'implementazione perché non riesco a ricevere nemmeno una classe pizza dal server. Sai aiutarmi su questo problema specifico?

    Fino a quando non risolvo questo problema non posso fare altro perché non appena specifico il numero il programma si blocco

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    0
    Ho risolto, grazie mille!

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.