Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [Socket] ObjectInputStream non funziona!

    Salve,

    sto scrivendo un programmino per trasferire files da un pc all'altro!
    Nel momento in cui dal programma di upload faccio partire appunto l'upload del file (programma client) nel programma server, che dunque è in attesa mediante il metodo readObject(), viene lanciata la seguente eccezione:
    (mensionata chiamando nel catch e.printStackTrace())

    codice:
    java.net.SocketException: Connection reset     at java.net.SocketInputStream.read(SocketInputStream.java:168)     at java.net.SocketInputStream.read(SocketInputStream.java:182)     at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2249)     at java.io.ObjectInputStream$BlockDataInputStream.peek(ObjectInputStream.java:2542)     at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2552)     at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1297)     at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)     at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)     at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)     at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)     at java.io.ObjectInputStream.readFatalException(ObjectInputStream.java:1968)     at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1332)     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)     at ReceiveFiles.main(ReceiveFiles.java:69)

    Vi posto quello che c'è nella riga 69 e nei suoi dintorni:
    codice:
    		try
    		{
    			portServer = new ServerSocket(port);
    			
    			while(true)
    			{
    				client = portServer.accept();
    				
    				if(client != null)
    				{	
    					System.out.println("Pronto a ricevere un file");
    					inFromUploader=new ObjectInputStream(client.getInputStream());
    					
    					try
    					{
    						System.out.println("\nFile da ricevere: ?");
    						
    						String fileName = (String) inFromUploader.readObject();// anche qui ottengo la stessa eccezione
    						
    						File f = new File(fileName);
    						
    						if(!f.exists())
    							f.createNewFile(); //file verranno scritti i bytes
    							
    						Packet pac = null;
    						scriviInFile = new FileOutputStream(f);
    						byte[] tmp = null;
    							
    						while((pac=(Packet)inFromUploader.readObject()) != null) //riga 69
    						{ //ecc..
    Naturalmente se il programma comprende anche questa riga "String fileName = (String) inFromUploader.readObject();" l'eccezione viene lanciata prima, esattamente quando l'esecuzione raggiunge questo punto! In questo caso dovrebbe leggere un oggetto di tipo String!
    Nella riga 69 invece dovrebbe ricevere un oggetto creato da me di tipo Packet (classe implementata anche lato client)

    Ecco la classe:

    codice:
     
    class Packet
    {
    	byte[] bytes;
    	String mex;
    	
    	public Packet(byte[] array, String message)
    	{
    		this.bytes=array;
    		this.mex=message;
    	}
    	
    	public byte[] getBytes()
    	{
    		return this.bytes;
    	}
    	
    	public String getMessage()
    	{
    		return this.mex;
    	}
    }
    Non capisco perchè da questi errori!

  2. #2
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    Per puro senso di carità nei confronti di chi volesse aiutarti:

    java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream. java:168)
    at java.net.SocketInputStream.read(SocketInputStream. java:182)
    at java.io.ObjectInputStream$PeekInputStream.peek(Obj ectInputStream.java:2249)
    at java.io.ObjectInputStream$BlockDataInputStream.pee k(ObjectInputStream.java:2542)
    at java.io.ObjectInputStream$BlockDataInputStream.pee kByte(ObjectInputStream.java:2552)
    at java.io.ObjectInputStream.readObject0(ObjectInputS tream.java:1297)
    at java.io.ObjectInputStream.defaultReadFields(Object InputStream.java:1947)
    at java.io.ObjectInputStream.readSerialData(ObjectInp utStream.java:1871)
    at java.io.ObjectInputStream.readOrdinaryObject(Objec tInputStream.java:1753)
    at java.io.ObjectInputStream.readObject0(ObjectInputS tream.java:1329)
    at java.io.ObjectInputStream.readFatalException(Objec tInputStream.java:1968)
    at java.io.ObjectInputStream.readObject0(ObjectInputS tream.java:1332)
    at java.io.ObjectInputStream.readObject(ObjectInputSt ream.java:351)
    at ReceiveFiles.main(ReceiveFiles.java:69)
    Probabilmente il client ha chiso la comunicazione: ad esempio vedi qui

    Sempre dal forum proviene anche questa.
    E' vero che qui l'eccezione dice Connection reset by peer però forse ci puoi trovare qualcosa di utile.
    "Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
    Linus Torvalds

  3. #3
    Ok Grazie! Però è sorto un nuovo problema:

    se trasferisco mp3, quando li vado ad eseguire ascolto sempre e solo i primi 10 KB
    (10 kb corrispondono alla grandezza dell'array che uso per trasferire le singole partizioni da 10.000 bytes del file)!

    Ho provato a trasferire altri tipi di file ad esempio i file di testo e lì non riscontro alcun problema!

    Perchè gli mp3 hanno quel problema?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da VincenzoTheBest
    se trasferisco mp3, quando li vado ad eseguire ascolto sempre e solo i primi 10 KB
    (10 kb corrispondono alla grandezza dell'array che uso per trasferire le singole partizioni da 10.000 bytes del file)!
    Questo mi fa venire in mente una cosa.

    Partiamo con qualche premessa: hai usato la "serializzazione" degli oggetti. Ok. Hai definito una tua classe Packet (serializzabile ovviamente, anche se nel codice sopra non l'hai evidenziato) che contiene un tot di byte da trasferire.

    Un file chiaramente può essere molto lungo e quindi certamente devi usare e trasferire molti Packet. Nel packet c'è un reference all'array di byte. Immagino (e qui sta la questione) che nella parte di codice dove leggi dal file e invii i packet tu usi e riusi lo stesso array di byte che poi banalmente assegni all'interno del Packet. E' così??

    Allora ...bang!! Questo è il problema. La serializzazione usa un sistema di "caching". Fin tanto che l'ObjectOutputStream è aperto, ogni volta che scrivi un nuovo oggetto, lui se lo tiene "cachato" in memoria ... lo tiene referenziato. Se successivamente invii lo stesso identico oggetto, lui lo scopre e non lo invia più fisicamente ma bensì invia tramite il suo "protocollo" una specie di "riferimento" per dire all'altra parte di riusare l'oggetto di prima.

    In sostanza vuol dire che invii solo la prima volta un tot di byte, le successive scritture inviano solo un "riferimento".

    Se vuoi usare la serializzazione, ok ma almeno dovresti comprendere molto bene come funziona!!!

    Soluzioni?
    a) Non usare la serializzazione ma un "tuo" protocollo che ti inventi tu.
    b) Usare la serializzazione ma:
    - creando ogni volta nuovi array (questo può avere altre conseguenze negative)
    oppure
    - usando writeUnshared()/readUnshared() (e leggi la documentazione!).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    andbin ancora una volta mi hai dato il consiglio giusto

    Praticamente nell'uploader mi è bastato sostitiuire al writeObject() il metodo writeUnshared() per l'invio delle partizioni che occupano interamente l'array "principale", mentre per l'ultima partizione vado a creare un nuovo array e lo invio usando writeObject().
    Invece nel programma che riceve il file ogni volta vado a leggere usando il metodo readUnshared()!

    Per il ProgressMonitor posso chiedere spiegazioni qui? oppure devo aprire una nuova discussione?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da VincenzoTheBest
    oppure devo aprire una nuova discussione?
    Sì.
    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.