Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
ASUS Expertbook PM3: il notebook robusto per le aziende
ASUS Expertbook PM3: il notebook robusto per le aziende
Pensato per le necessità del pubblico d'azienda, ASUS Expertbook PM3 abbina uno chassis particolrmente robusto ad un pannello da 16 pollici di diagonale che avantaggia la produttività personale. Sotto la scocca troviamo un processore AMD Ryzen AI 7 350, che grazie alla certificazione Copilot+ PC permette di sfruttare al meglio l'accelerazione degli ambiti di intelligenza artificiale
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo
Abbiamo provato per diversi giorni una new entry del mercato italiano, la Gowow Ori, una moto elettrica da off-road, omologata anche per la strada, che sfrutta una pendrive USB per cambiare radicalmente le sue prestazioni
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-11-2010, 11:57   #1
m0linas
Member
 
L'Avatar di m0linas
 
Iscritto dal: Feb 2008
Città: PoggibonZi
Messaggi: 140
[JAVA] input e output sulla stessa Socket

Ciao a tutti, devo farvi una domanda riguardo alle Socket, perchè nonostante ci abbia provato e riprovato veramente non riesco a capire....
So che si può comunicare in entrambe le direzioni sulla stessa socket, ma nel mio programma non riesco in nessun modo a farlo....bisogna che le letture/scritture avvengano all'interno dello stesso ciclo () ?
Vi spiego in 2 parole...ho creato un programma molto rozzo di file sharing p2p per un esame all'università, e funziona. Il problema è che per aggiornare le liste dei file (client invia la lista dei files locali da condividere, e il server gli rimanda indietro la lista completa dei files disponibili) mi tocca usare 2 socket diverse, una per l'invio e una per la ricezione.
La cosa è decisamente brutta, e vorrei che tutto avvenisse sulla stessa socket, dato che da quanto ho capito la cosa si può fare....
In pratica il client manda la lista sulla socket, il server legge dalla socket la lista, la appende alla lista che già possiede, e rimanda quest'ultima (tramite la stessa socket) al client, che la legge e me la visualizza in una JList.
Il problema è la parte in neretto, tutto il resto funziona tranquillamente....

Questo è il metodo lato client:

Codice:
public void inviaLista()
	{
		Socket s = null; 
		try {
			s = new Socket();
			s.connect(new InetSocketAddress(ip, port));
                        s.setSoTimeout(timeout);
			if (!listaLocali.isEmpty()) listaLocali.clear(); // elimino la vecchia lista e la creo nuova
			salvaLista(new File("."));   // verranno condivisi solamente i file nella cartella corrente
			
			BufferedOutputStream bout = new BufferedOutputStream(s.getOutputStream());
			ObjectOutputStream out = new ObjectOutputStream(bout);
			for (int i=0;i<listaLocali.size();i++)
			{
				out.writeObject(listaLocali.get(i));
			}
			
			// prende indietro la lista			
			ObjectInputStream inLista = new ObjectInputStream(new BufferedInputStream(s.getInputStream()));
			FileProva infl = (FileProva)inLista.readObject();
			try 
			{
				while (infl != null)
				{
					synchronized(listaFiles)
					{
						listaFiles.add(infl);
					}
					infl = (FileProva)inLista.readObject();
				}
			}catch (EOFException eof) {}
			synchronized(listaFiles)
			{
				for (int i=0;i<listaFiles.size();i++)
				{
					listmodel.addElement(listaFiles.get(i)); 
				}
			}
			lista.setModel(listmodel);
        	lista.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
			lista.setLayoutOrientation(JList.VERTICAL);
			lista.setVisibleRowCount(-1);
			inLista.close();
			out.flush();
			bout.flush();
			out.close();
			s.close();
		} catch (IOException ee) {System.out.println("Errore del client!" ); ee.printStackTrace();}
		catch (ClassNotFoundException cnfe) {cnfe.printStackTrace();}
	}
Questo è il thread sul server col quale il metodo precedente comunica:

Codice:
public void run()
	{
		try
		{
			BufferedInputStream bin = new BufferedInputStream(s.getInputStream());
			ObjectInputStream in = new ObjectInputStream(bin);
			InetAddress client = s.getInetAddress();
			synchronized(ServerProva.filesArray)
			{
				for (int pd=0;pd<ServerProva.filesArray.size();pd++)
				{
					if (ServerProva.filesArray.get(pd).getOwner().equals(client)) 
					{
						ServerProva.filesArray.remove(pd);
						pd--;
					}
				}
			}
			FileProva inFile = (FileProva)in.readObject();
			try 
			{
				while (inFile != null)
				{
					synchronized(ServerProva.filesArray)
					{
						ServerProva.filesArray.add(inFile);
						inFile = (FileProva)in.readObject();
					}
				}
			}catch (EOFException eof) {}

			
			// Invia al client la lista completa dei files disponibili
			// sulla rete
		
			BufferedOutputStream bout = new BufferedOutputStream(s.getOutputStream());
			ObjectOutputStream outLista = new ObjectOutputStream(bout);
			synchronized(ServerProva.filesArray)
			{
				for (int i=0;i<ServerProva.filesArray.size();i++)
				{
					FileProva f = ServerProva.filesArray.get(i);
					outLista.writeObject(f);
				}
			}
			in.close();
			bout.flush();
			outLista.flush();
			outLista.close();
			s.close();
			
			} catch (InterruptedIOException e) {System.out.println("Timeout in ServerThread");e.printStackTrace();}
		 catch (IOException ee) {System.out.println("Errore di IO in ServerThread");ee.printStackTrace();}
		catch (ClassNotFoundException cnfe) {cnfe.printStackTrace();}
	}
E questo è l'errore che mi becco:

Codice:
Errore del client!
java.net.SocketTimeoutException: Read timed out
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.read(SocketInputStream.java:129)
	at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
	at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
	at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2266)
	at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2279)
	at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750)
	at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)
	at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
	at ClientProva.inviaLista(ClientProva.java:128)
	at ClientProva.aggiorna(ClientProva.java:167)
	at ClientProva.main(ClientProva.java:202)
Nel lato client, se chiudo lo stream in uscita appena ho scritto sulla socket, quando vado a fare s.getInputStream mi dice

Codice:
java.net.SocketException: Socket is closed
	at java.net.Socket.getInputStream(Socket.java:788)
	at ClientProva.inviaLista(ClientProva.java:131)
	at ClientProva.aggiorna(ClientProva.java:168)
	at ClientProva.main(ClientProva.java:203)
Errore di IO in ServerThread
java.net.SocketException: Socket closed
	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:99)
	at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
	at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
	at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
	at ServerThread.run(ServerThread.java:75)
In pratica se chiudo subito uno dei 2 stream dello stesso processo, l'altro vede chiusa proprio la socket, se non li chiudo si pianta tutto e va in timeout....

É una settimana che il programma sarebbe finito, tranne per questa cagata qui....sarò infinitamente grato a chi mi risolve l'arcano!
__________________
Ho felicemente trattato con: Isomarcus, NLDomy, cipacci.

Intel e2180 @ 3.1Ghz + Arctic Cooling Freezer 7 ~ MSI P35 Neo2-FR ~ Geil Black Dragon @ 970Mhz 4-4-4-12 ~ ASUS 8800GT 512Mb ~ OCZ StealthXtream 500W

Ultima modifica di m0linas : 17-11-2010 alle 16:22. Motivo: errore di copiatura codice
m0linas è offline   Rispondi citando il messaggio o parte di esso
Old 17-11-2010, 13:24   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Credo che il problema sia in 'inviaLista', qui:
Codice:
...
    // prende indietro la lista			
    ObjectInputStream inLista = new ObjectInputStream(new BufferedInputStream(s.getInputStream()));
    FileProva infl = (FileProva)inLista.readObject();
...
L'operazione di lettura dall'inpuStream del Socket ti va in timeout (come testimoniato dall'eccezione) perchè probabilmente dall'altra parte il server deve ancora inviare le informazioni che il tuo client si apetta di ricevere e l'inpuStream è vuoto.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 17-11-2010, 16:32   #3
m0linas
Member
 
L'Avatar di m0linas
 
Iscritto dal: Feb 2008
Città: PoggibonZi
Messaggi: 140
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Credo che il problema sia in 'inviaLista', qui:
Codice:
...
    // prende indietro la lista			
    ObjectInputStream inLista = new ObjectInputStream(new BufferedInputStream(s.getInputStream()));
    FileProva infl = (FileProva)inLista.readObject();
...
L'operazione di lettura dall'inpuStream del Socket ti va in timeout (come testimoniato dall'eccezione) perchè probabilmente dall'altra parte il server deve ancora inviare le informazioni che il tuo client si apetta di ricevere e l'inpuStream è vuoto.
Ciao, grazie per avermi risposto, come sempre. Molto gentile.
Allora, non ci pensavo che incollando il codice qua non mi riportava i numeri di riga del compilatore....la riga in cui da il timeout, è quella in cui istanzio l'inputstream, non quella dove faccio readObject().

Codice:
...
    // prende indietro la lista			
    ObjectInputStream inLista = new ObjectInputStream(new BufferedInputStream(s.getInputStream()));
    FileProva infl = (FileProva)inLista.readObject();
...
Fra l'altro ho infilato Thread.sleep(3000) in inviaLista() fra l'invio sull'output e la ricezione dal server (il timeout della socket è 5000...), ma resta comunque 5 secondi bloccato, e poi mi da ancora read timed out........qualche idea?
__________________
Ho felicemente trattato con: Isomarcus, NLDomy, cipacci.

Intel e2180 @ 3.1Ghz + Arctic Cooling Freezer 7 ~ MSI P35 Neo2-FR ~ Geil Black Dragon @ 970Mhz 4-4-4-12 ~ ASUS 8800GT 512Mb ~ OCZ StealthXtream 500W
m0linas è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2010, 09:43   #4
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da m0linas Guarda i messaggi
...
Allora, non ci pensavo che incollando il codice qua non mi riportava i numeri di riga del compilatore....la riga in cui da il timeout, è quella in cui istanzio l'inputstream, non quella dove faccio readObject().
...
No, l'errore è dove fai l'operazione di read.
L'eccezione è chiarissima:
Codice:
java.net.SocketTimeoutException: Read timed out
Quel time out di lettura c'entra proprio con il timeout che hai impostato sulla Socket con il meotod setSoTimeout, vedi javadoc:
Quote:
public void setSoTimeout(int timeout)
throws SocketException

Enable/disable SO_TIMEOUT with the specified timeout, in milliseconds. With this option set to a non-zero timeout, a read() call on the InputStream associated with this Socket will block for only this amount of time. If the timeout expires, a java.net.SocketTimeoutException is raised, though the Socket is still valid. The option must be enabled prior to entering the blocking operation to have effect. The timeout must be > 0. A timeout of zero is interpreted as an infinite timeout.
Prova a leggere cos'è e cosa fa il metodo available di un InputStream, potrebbe tornarti utile per risolvere parzialmente il problema.

Il fatto qui è che quando il client tenta di leggere lo stream di input dal server, i dati non ci sono ne arrivano entro il timeout che gli hai impostato. E i motivi possono essere due (devi verificare quale è il tuo caso):
1) Il server deve ancora inviarli e comunque non arrivano entro il timeout di lettura impostato.
2) Il server li ha già inviati sullo stream, ma poi ha chiuso la connessione e a seguito di questa azione i dati inviati nello stream sono stati scartati: quando il client va a leggere non trova nulla, attende, scade il timeout di lettura e parte l'eccezione.

Il punto (2) può verificarsi, lo dice il javadoc di Socket.getInputStream():
Quote:
public InputStream getInputStream()
throws IOException
...
Under abnormal conditions the underlying connection may be broken by the remote host or the network software (for example a connection reset in the case of TCP connections). When a broken connection is detected by the network software the following applies to the returned input stream :

* The network software may discard bytes that are buffered by the socket. Bytes that aren't discarded by the network software can be read using read.

* If there are no bytes buffered on the socket, or all buffered bytes have been consumed by read, then all subsequent calls to read will throw an IOException.

* If there are no bytes buffered on the socket, and the socket has not been closed using close, then available will return 0.

Closing the returned InputStream will close the associated socket.
...
In sinstesi, da quello che capisco, il tuo problema poterbbe essere la mancanza di un protocollo (per quanto minimale) tra client e server per gestire la comunicazione correttamente.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 18-11-2010 alle 10:00.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design   Recensione OnePlus 15: potenza da vendere e batt...
AMD Ryzen 5 7500X3D: la nuova CPU da gaming con 3D V-Cache per la fascia media AMD Ryzen 5 7500X3D: la nuova CPU da gaming con ...
L'Olanda 'cede' alla Cina: retromarcia t...
Stagione 1 al via: tutte le novità...
TikTok rafforza trasparenza e benessere ...
Zigbee 4.0 è qui: più sic...
La trasformazione agentica di Windows pa...
Crollo del 29% nelle vendite dirette: Ub...
Black Friday anticipato su Amazon: NARWA...
Disastro WhatsApp: esposti 3,5 miliardi ...
Hatsune Miku per tutti: ASUS ROG present...
La Definitive Edition di Tomb Raider sba...
Sicurezza PC: Microsoft punta sui chip d...
Gemini 3 Pro disponibile ora: è i...
Super sconti robot aspirapolvere: ECOVAC...
DOOM: The Dark Ages si espande con Ripat...
EA SPORTS annuncia il futuro della serie...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 13:53.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v