Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    31

    [Java] ObjectInpustStream e Connection Reset

    Buonasera! Sono ancora alle prese con una gestione di taxi client-server. Ho reimplementato tutte le classi seguendo i vostri consigli, ma accade una cosa stranissima.
    Premetto che per ora ho solo creato 3 classi: Taxi,Gestore e Posizione.
    Taxi: client
    Gestore: server
    Posizione: solo 2 attributi (2 interi) e un costruttore
    Ecco il Taxi
    codice:
    import java.io.*;
    import java.lang.*;
    import java.util.*;
    import java.net.*;
    
    public class Taxi implements Runnable,Serializable{
    	private Socket s;
    	private boolean libero;
    	private Posizione p;
    	protected int id;
    	protected ObjectOutputStream oos;
    	protected ObjectInputStream ois;
    	
    	public Taxi(){
    		//taxi creato
    	}
    	
    	public Taxi(int a, int b, boolean l){
    		p = new Posizione(a,b);
    		libero = l;
    	}
    	
    	public static void main(String args[]){
    		Taxi tx = new Taxi();
    		Thread t = new Thread(tx);
    		t.start();
    	}
    	
    	public void run(){
    		try{
    			s = new Socket("localhost", 12345);
    			oos = new ObjectOutputStream(s.getOutputStream());
    			ois = new ObjectInputStream(s.getInputStream());
    			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    			oos.writeObject(true);//dico al server che sono un taxi
    			oos.flush();
    			System.out.println("Inserisci le tue coordinate: ");
    			int a = Integer.parseInt(br.readLine());
    			int b = Integer.parseInt(br.readLine());
    			System.out.println("Stato del taxi: "+true);
    			Taxi otx = new Taxi(a,b,true);
    			System.out.println("Mando oggetto taxi al server");
    			oos.writeObject(otx);
    		}
    		catch(IOException e){System.out.println("Error "+e);}
    	}
    }
    Sul client non accade nulla di strano. Ecco il server:
    codice:
    import java.io.*;
    import java.util.*;
    import java.lang.*;
    import java.net.*;
    
    public class Gestore implements Runnable,Serializable{
    	private ServerSocket ss;
    	private Socket cs;
    	protected LinkedList <Taxi> taxilist = new LinkedList <Taxi> ();
    	protected ObjectOutputStream oos;
    	protected ObjectInputStream ois;
    	
    	public Gestore(){
    		//Gestore creato
    	}
    	
    	public static void main(String args[]){
    		Gestore g = new Gestore();
    		Thread t = new Thread(g);
    		t.start();
    	}
    	
    	public void run(){
    		try{
    			ss = new ServerSocket(12345);
    			boolean id;
    			while(true){
    				System.out.println("Ciao sono il Server");
    				cs = ss.accept();
    				oos = new ObjectOutputStream(cs.getOutputStream());
    				ois = new ObjectInputStream(cs.getInputStream());
    				id = (boolean) ois.readObject();
    				System.out.println(ois.available());
    				if(id == true) {
    					System.out.println("Benvenuto Taxi");
    					int tid = taxilist.size() +1;
    					Taxi app = new Taxi(); 
    					app = (Taxi) ois.readObject();
    					app.id = tid;
    					taxilist.add(app);
    					//CHIAMATA THREAD GESTORETAXI
    				}
    				else{
    					//CHIAMATA THREAD GESTORECLIENTI
    				}
    			}
    		}
    		catch(IOException e){System.out.println("Error "+e);}
    		catch(ClassNotFoundException e){System.out.println("Error "+e);}
    	}
    }
    Qui dopo aver eseguito la prima readObject() ovvero la lettura del booleano che mi identifica il taxi, non legge più nulla e và in Socket Exception: connection reset
    precisamente la riga di codice che dovrebbe essere incriminata è questa
    codice:
    app = (Taxi) ois.readObject();
    E' un giorno intero che sbatto la testa su questo problema, ho provato di tutto! Grazie per l'attenzione

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ci sono comunque 3 cose che posso subito farti notare:

    1) Taxi ha il main() quindi è il punto di ingresso per una applicazione "standalone". Se non ha interfaccia grafica e fa solo quello che vedo nel codice, allora non c'è bisogno di creare un thread. La gestione del Socket e la comunicazione potrebbe essere benissimo fatta nel "main" thread (quello appunto che esegue il main() ).

    2) Gestore idem come sopra, ha il main() quindi lo usi come applicazione standalone. Idem non servirebbe strettamente creare un thread per il loop di accept, che invece potrebbe andare tranquillamente nel main thread.

    3) Taxi però fa sia da entry point della applicazione, sia "modella" le informazioni di un taxi. E tu al server invii appunto una istanza di Taxi. Il fatto che rappresenti 2 cose distinte (applicazione e taxi) non va bene. Fai una classe Taxi che modella solo un taxi e un'altra classe es. ClienteTaxi (con main, Socket, ecc...).
    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
    Jan 2012
    Messaggi
    31
    Ho capito il concetto, grazie
    Domattina a mente lucida provo a sistemare! Grazie ancora e buona serata

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    AH, visto che hai già un'altra entità "cliente" (oltre che "taxi"), magari la classe chiamala TaxiApp o qualcosa del genere. Ma giusto per non confondere con l'altra parte del "cliente".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.