Torna indietro   Hardware Upgrade Forum > Software > Programmazione

TCL P80 Ultra: con un display AMOLED opaco è una gioia per gli occhi e per le dita
TCL P80 Ultra: con un display AMOLED opaco è una gioia per gli occhi e per le dita
TCL P80 Ultra abbina per la prima volta un pannello AMOLED alla tecnologia NXTPAPER con finitura opaca, affiancandoci una fotocamera periscopica da 50 MP con zoom ottico 3x, il SoC Dimensity 7400 Elite e una batteria da 5.800 mAh. Nella prova sul campo emergono luminosità di picco molto elevata, comparto fotografico solido per la fascia di prezzo e autonomia nella media, a fronte di velocità di scrittura dello storage piuttosto contenute
HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio
HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio
HUAWEI MatePad Air combina diverse carte molto interessanti: un OLED PaperMatte da 12 pollici, un corpo sottile e una tastiera molto comoda. Durante la prova abbiamo apprezzato fluidità, audio e comfort visivo, mentre i test hanno chiarito pregi e qualche limite nelle prestazioni. L'autonomia ha convinto anche nell'uso intermittente; la scelta passa dalla compatibilità delle proprie app e dal valore del pacchetto con accessori, proposto a 749 euro
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica
Debuttano ufficialmente i primi sistemi notebook basati su piattaforma NVIDIA RTX Spark, abbinati a Windows on ARM e pensati per l'intelligenza artificiale agentica. Architettura integrata tra CPU e GPU che condividono la memoria di sistema, capace di gestire in locale modelli molto grandi ma al contempo anche di spiccare con la grafica e l'elaborazione
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-06-2015, 20:47   #1
Giobbo
Member
 
Iscritto dal: Aug 2013
Messaggi: 42
[JAVA] Problema di lettura/scrittura oggetti tramite Socket

Ciao a tutti.
Vado subito al sodo.
Sto effettuando delle prove per capire al meglio il funzionamento di Socket, ServerSocket, pattern Proxy e Skeleton e scrittura/lettura di oggetti.
Ma ho un problema che non riesco a risolvere (fondamentalmente perché non lo riesco a capire).
Innanzitutto metto subito le classi.

MainClient (che è banalmente il main del client che avvia il proxy e crea l'oggetto da inviare). Banalmente, l'oggetto è formato da due stringhe:

Codice:
public class MainClient {

	public static void main(String [] args) throws Exception {
		System.out.println("CLIENT: ciao sono il client");
		User user = new User ("Giobbo", "password");
		Proxy proxy = new Proxy();
		proxy.printUser(user);
	}
}
Proxy, che è la classe che si occupa di creare la connessione con il server (o meglio, lo Skeleton):

Codice:
import java.io.*;
import java.net.*;

public class Proxy implements ServerInterface {
	
	private Socket socket;
	private ObjectInputStream ois;
	private ObjectOutputStream oos;
	
	public Proxy() throws Exception {
		InetAddress addr = InetAddress.getByName(null);
		socket = new Socket(addr , ServerInterface.PORT);
		System.out.println("PROXY: creazione fatta");
		ois = new ObjectInputStream(socket.getInputStream());
		oos = new ObjectOutputStream (socket.getOutputStream());
	}

	@Override
	public void printUser(User user) throws IOException {
		oos.writeObject(user);
		oos.close();
		this.close();
		System.out.println("PROXY: Chiudo connessione con server");
	}
	
	public void close() throws IOException {
		this.socket.close();
	}
}
MainServer, che è il main per lanciare il server:

Codice:
import java.net.*;

public class MainServer {
	
	public static void main(String[] args) throws Exception {
		ServerSocket server_socket = new ServerSocket(ServerInterface.PORT);
		System.out.println("Server socket avviato: " + server_socket);

		while(true) {
			System.out.println ("In attesa di una connessione..."); 
			Socket socket = server_socket.accept();
			System.out.println("Socket connesso: " + socket);
			new Thread(new Skeleton(socket)).start();
		}
	}
}
Skeleton, che è chiaro cosa fa dal nome:

Codice:
import java.io.*;
import java.net.*;

public class Skeleton implements ServerInterface, Runnable {
	
	private Socket socket;
	private ObjectInputStream ois;
	private ObjectOutputStream oos;
	
	private Server server = new Server() ;
	
	public Skeleton(Socket socket) throws IOException {
		this.socket = socket;
		System.out.println("SKELETON: creazione skeleton fatta");
		ois = new ObjectInputStream(socket.getInputStream());
		System.out.println("SKELETON: creazione skeleton fatta");
		oos = new ObjectOutputStream (socket.getOutputStream());
	}
	
	public void run() {
		try {
			while(!this.socket.isClosed()) {
				User user = (User) ois.readObject();
				this.printUser(user);
				this.close();
				}
		} catch(Exception e) {
			e.printStackTrace();
			try {
				this.socket.close();
			} catch(IOException e2) {
				System.err.println("Chiusura socket fallita...");
			}
		}
	}

	@Override
	public void printUser(User user) throws IOException {
		server.printUser(user);
	}
	
	public void close() throws IOException {
		this.socket.close();
	}

}
Server, che è la classe che modella il server reale che fornisce il servizio (che qui banalmente è stampare i campi dell'oggetto inviato):

Codice:
public class Server implements ServerInterface{

	@Override
	public void printUser(User user/*String str*/) throws IOException {
		System.out.println("Ciao, sono il SERVER. Mi hai inviato questi dati...");
		System.out.println("FaceID: " + user.getFaceId());
		System.out.println("Password: " + user.getPassword());
	}

}
Infine la semplice interfaccia che fornisce i metodi alle classi Proxy, Skeleton e Server (oltre alla costante PORT per creare ServerSocket e Socket):

Codice:
import java.io.*;

public interface ServerInterface {
	
	public static final int PORT = 8080;
	
	public void printUser(User user /*String str*/) throws IOException;

}

Bene.
Il tutto funziona perfettamente se al posto dell'oggetto User invio dal client al server una semplice stringa (modificando opportunamente gli Input e gli Output).
Ma se invio l'oggetto, l'esecuzione si blocca e stappandola mi viene dato un errore. Esattamente così come sotto.

Output server:
Codice:
Server socket avviato: ServerSocket[addr=0.0.0.0/0.0.0.0,localport=8080]
In attesa di una connessione...
Socket connesso: Socket[addr=/127.0.0.1,port=57981,localport=8080]
SKELETON: creazione skeleton fatta
Output client:
Codice:
CLIENT: ciao sono il client
PROXY: creazione fatta
Come si vede, la Socket viene creata correttamente (come la Proxy) ma poi l'esecuzione si ferma lì. E se la vado a stoppare, mi da questa eccezione:
Codice:
Exception in thread "main" java.io.EOFException
	at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2328)
	at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2797)
	at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:802)
	at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
	at Skeleton.<init>(Skeleton.java:20)
	at MainServer.main(MainServer.java:15)
La riga "incriminata" è questa:

Codice:
ois = new ObjectInputStream(socket.getInputStream());
Ho provato a cercare in rete varie possibili soluzioni relative a questo tipo di eccezione, ma non ho trovato nulla che potesse aiutarmi.

Qualcuno sa aiutarmi in qualche modo?
Gliene sarei molto grato.
Grazie mille per la pazienza e la disponibilità a chi avrà voglia di leggere e provare a rispondermi.
Giobbo è offline   Rispondi citando il messaggio o parte di esso
Old 18-06-2015, 08:02   #2
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
In Proxy, inverti la creazione dell'ObjectInputStream con l'ObjectOutputStream, cosi' come mostrato di seguito:

Codice:
public class Proxy implements ServerInterface {
	
	private Socket socket;
	private ObjectInputStream ois;
	private ObjectOutputStream oos;
	
	public Proxy() throws Exception {
		InetAddress addr = InetAddress.getByName(null);
		socket = new Socket(addr , ServerInterface.PORT);
		System.out.println("PROXY: creazione fatta");
        //		Sottovento - inverto creazione ois con creazione oos
		oos = new ObjectOutputStream (socket.getOutputStream());
		ois = new ObjectInputStream(socket.getInputStream());
	}

	@Override
	public void printUser(User user) throws IOException {
		oos.writeObject(user);
		oos.close();
		this.close();
		System.out.println("PROXY: Chiudo connessione con server");
	}
	
	public void close() throws IOException {
		this.socket.close();
	}
}
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 18-06-2015, 12:36   #3
Giobbo
Member
 
Iscritto dal: Aug 2013
Messaggi: 42
Sottovento, ti ringrazio moltissimo!
Così funziona! Grazie davvero.

Ora la domanda è d'obbligo: perché?
Nel senso, qual'è la logica di questa "correzione" e quindi non fa presentare l'errore?
Giobbo è offline   Rispondi citando il messaggio o parte di esso
Old 18-06-2015, 12:42   #4
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da Giobbo Guarda i messaggi
Sottovento, ti ringrazio moltissimo!
Così funziona! Grazie davvero.

Ora la domanda è d'obbligo: perché?
Nel senso, qual'è la logica di questa "correzione" e quindi non fa presentare l'errore?
Quando esegui
Codice:
ois = new ObjectInputStream(socket.getInputStream());
Crei uno stream di oggetti, quindi non sei piu' responsabile di ogni singolo byte che spedisci nella socket, ma ti affidi a Java, sapendo che Java introdurra' informazioni aggiuntive per poter spedire e ricevere (quindi ricostruendo correttamente) degli oggetti.
Alla creazione, Java si aspetta che la controparte spedisca dei dati, una specie di intestazione. Quindi il programma restera' bloccato su questa istruzione fintanto che dall'altra parte qualcuno non crei un ObjectOutputStream().

Siccome il client creava prima l'ObjectInputStream, erano entrambi bloccati ad aspettarsi l'un l'altro. Un deadlock, insomma.
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 18-06-2015, 12:51   #5
Giobbo
Member
 
Iscritto dal: Aug 2013
Messaggi: 42
Ok, charissimo.
Non lo sapevo proprio. Ben venga, una cosa in più da sapere.
Io ho invertito i costruttori sia nel Proxy che nello Skeleton, e funziona. E' un errore? Dalla spiegazione che mi hai dato non credo.
Grazie ancora.
Giobbo è offline   Rispondi citando il messaggio o parte di esso
Old 18-06-2015, 14:01   #6
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da Giobbo Guarda i messaggi
Ok, charissimo.
Non lo sapevo proprio. Ben venga, una cosa in più da sapere.
Io ho invertito i costruttori sia nel Proxy che nello Skeleton, e funziona. E' un errore? Dalla spiegazione che mi hai dato non credo.
Grazie ancora.
No, dovrebbe essere corretto. E' sempre meglio creare prima l'OutputObjectStream.
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 19-06-2015, 13:22   #7
Giobbo
Member
 
Iscritto dal: Aug 2013
Messaggi: 42
EDIT: problema risolto

Ultima modifica di Giobbo : 20-06-2015 alle 10:17.
Giobbo è offline   Rispondi citando il messaggio o parte di esso
Old 20-06-2015, 10:17   #8
Giobbo
Member
 
Iscritto dal: Aug 2013
Messaggi: 42
EDIT:
sottovento, mi si è presentato un nuovo problema sempre relativo all'eccezione (EOFException) precedente.
Innanzitutto qui c'è il progetto che sto sviluppando:

https://github.com/Giobbo89/my-facedoor

Ora ti espongo il problema.
Sto testando il funzionamento del database e per farlo vado nella pagina di registrazione (classe RegisterPanel) e, dopo aver inserito i dati, completo la registrazione cliccando sul pulsante apposito, che invia i dati al server tramite l'invio di due oggetti (la parte in questione si trova sempre in RegisterPanel dalla riga 151).
Da qui quindi si crea il Proxy che invia i dati allo Skeleton e via dicendo (in questo caso le classi sono praticamente identiche a prima, invio in più solamente delle stringhe per determinare l'operazione da eseguire).
In pratica, effettuo una registrazione di prova e la cosa va a buon fine, senza errori di sorta.
Ma se tento di eseguire un'altra registrazione (con primary key diversa dalla precedente, quindi non è un problema di database) allora mi viene lanciata l'eccezione (in particolare dalla riga 34 della classe Skeleton).
Preciso che la cosa si verifica se tento di eseguire due registrazioni durante la medesima esecuzione del client, quindi senza chiuderlo e riaprirlo. Se invece ne faccio una, poi chiudo il client e lo riapro, allora va una nuova registrazione va a buon fine (ma non un'eventuale seconda).
Giobbo è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2015, 07:53   #9
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Ciao
scusa il ritardo, ultimamente non passo spesso sul forum.
Mi puoi riassumere
- cosa fa il programma?
- cosa devo scaricare per vedere l'errore?
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2015, 12:23   #10
Giobbo
Member
 
Iscritto dal: Aug 2013
Messaggi: 42
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Ciao
scusa il ritardo, ultimamente non passo spesso sul forum.
Mi puoi riassumere
- cosa fa il programma?
- cosa devo scaricare per vedere l'errore?
Il programma in sé è una sorta di piccolo (ed inutile ) social network, dove un utente si registra e compila il suo profilo e può eseguire ricerche per trovare altri profili.

Per vedere l'errore ti conviene scaricare il tutto e poi eseguire questi passaggi:
1. devi avere postgresql
2. eseguire dal terminale il file sh create_databases.sh
3. avviare il main del server (che presenta solo output sulla "console") e poi quello del client, che invece è formato da un'interfaccia grafica.
4. per vedere l'errore, basta che provi a registrarti e poi a loggarti con i dati appena inseriti.

In pratica si presenta se si eseguono due operazioni di comunicazione tra client e server durante la stessa esecuzione: la prima va a buon fine, qualunque essa sia, mentre la seconda no.
Il che mi fa pensare che l'errore stia nella creazione di nuovi Threads della classe Skeleton, visto che la prima comunicazione funziona perfettamente.
Giobbo è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2015, 09:06   #11
Giobbo
Member
 
Iscritto dal: Aug 2013
Messaggi: 42
sottovento, non hai avuto modo di vedere il problema?
Facendo varie prove, ho visto che l'eccezione è generata sempre nello Skeleton quando provo (sempre che si tratti della seconda operazione client-server durante quell'esecuzione) a leggere un'oggetto tramite l'ObjectInputStream.
Ma non riesco a capire perché la prima volta funziona correttamente, mentre la seconda no.
Giobbo è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2015, 10:27   #12
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Scusami, sono davvero preso. Mi dispiace. Provo a scaricarlo fra qualche ora, chiedo perdono!
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2015, 18:39   #13
Giobbo
Member
 
Iscritto dal: Aug 2013
Messaggi: 42
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Scusami, sono davvero preso. Mi dispiace. Provo a scaricarlo fra qualche ora, chiedo perdono!
Ma ci mancherebbe altro, figurati!
Era giusto per chiedere visto che ancora io non ho capito quale sia il problema.
Giobbo è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2015, 21:11   #14
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Ho dato un'occhiata. Non ho il database a disposizione, quindi non posso far girare il sistema (anche se sto pensando che magari, visto che non sembra un problema di database, potrei eliminare le parti che lo riguardano, per fare un test veloce).

Se ho ben capito, fai cosi': per ogni registrazione il client
- apre una socket
- scrive un paio di oggetti
- chiude la socket

Dall'altra parte (server) ci si aspetta di vedere le operazioni speculari, vale a dire
- accettare la socket
- leggere un paio di oggetti
- chiudere la socket

In realta' il server fa un lavoro un po' diverso:

Codice:
	public Skeleton(Socket socket, Server server) throws IOException {
                ...
		in = new BufferedReader (new InputStreamReader(socket.getInputStream())); // Perche'?
		out = new PrintWriter (new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); // Perche'?

		oos = new ObjectOutputStream (socket.getOutputStream()); // OK
		ois = new ObjectInputStream(socket.getInputStream()); // OK
	}
Poi, per la lettura:
Codice:
        while(!this.socket.isClosed()) { // Perche'?
               String op = in.readLine();  // Perche' leggi una stringa cosi'?
               User user = (User) ois.readObject();
               Profile profile = (Profile) ois.readObject();
         }
Analogamente fai una println() di una stringa in scrittura

Ho due considerazioni:
1 - Se crei degli ObjectInputStream/ObjectOutputStream, usa quelli! Non mischiare con altri stream!!
Se hai bisogno di trasmettere una stringa, lo puoi sempre fare con oos.WriteObject e leggerla allo stesso modo.
2 - L'errore apparentemente (scusa, non ho investigato con un debugger) e' dovuto al fatto che usi un while.
Dopo aver letto gli oggetti, il server fa un altro giro di giostra ed e' fermo su
String op = in.readLine();
mentre il client ha finito di spedire e si appresta a chiudere la socket. A questo punto, la in.readLine() fallisce perche' gli hai chiuso la socket sotto il naso, quindi si arrabbia.
In realta' sai che devi ricevere due oggetti (anzi 3, considerando la stringa) e poi chiudere, quindi sarebbe meglio leggere i 3 oggetti e non fare ulteriori cicli; a meno che, s'intende, tu non voglia considerare un altro protocollo di comunicazione (per esempio, tenendo la socket sempre aperta, ecc).
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2015, 06:52   #15
Giobbo
Member
 
Iscritto dal: Aug 2013
Messaggi: 42
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Ho dato un'occhiata. Non ho il database a disposizione, quindi non posso far girare il sistema (anche se sto pensando che magari, visto che non sembra un problema di database, potrei eliminare le parti che lo riguardano, per fare un test veloce).

Se ho ben capito, fai cosi': per ogni registrazione il client
- apre una socket
- scrive un paio di oggetti
- chiude la socket

Dall'altra parte (server) ci si aspetta di vedere le operazioni speculari, vale a dire
- accettare la socket
- leggere un paio di oggetti
- chiudere la socket

In realta' il server fa un lavoro un po' diverso:

Codice:
	public Skeleton(Socket socket, Server server) throws IOException {
                ...
		in = new BufferedReader (new InputStreamReader(socket.getInputStream())); // Perche'?
		out = new PrintWriter (new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); // Perche'?

		oos = new ObjectOutputStream (socket.getOutputStream()); // OK
		ois = new ObjectInputStream(socket.getInputStream()); // OK
	}
Poi, per la lettura:
Codice:
        while(!this.socket.isClosed()) { // Perche'?
               String op = in.readLine();  // Perche' leggi una stringa cosi'?
               User user = (User) ois.readObject();
               Profile profile = (Profile) ois.readObject();
         }
Analogamente fai una println() di una stringa in scrittura

Ho due considerazioni:
1 - Se crei degli ObjectInputStream/ObjectOutputStream, usa quelli! Non mischiare con altri stream!!
Se hai bisogno di trasmettere una stringa, lo puoi sempre fare con oos.WriteObject e leggerla allo stesso modo.
2 - L'errore apparentemente (scusa, non ho investigato con un debugger) e' dovuto al fatto che usi un while.
Dopo aver letto gli oggetti, il server fa un altro giro di giostra ed e' fermo su
String op = in.readLine();
mentre il client ha finito di spedire e si appresta a chiudere la socket. A questo punto, la in.readLine() fallisce perche' gli hai chiuso la socket sotto il naso, quindi si arrabbia.
In realta' sai che devi ricevere due oggetti (anzi 3, considerando la stringa) e poi chiudere, quindi sarebbe meglio leggere i 3 oggetti e non fare ulteriori cicli; a meno che, s'intende, tu non voglia considerare un altro protocollo di comunicazione (per esempio, tenendo la socket sempre aperta, ecc).
Mmmmm, ma la registrazione va a buon fine, se è la prima operazione di comunicazione che eseguo. Così come il login.
Il problema si presenta (con qualsiasi operazione client-server, registrazione, login, modifica password, ecc...) alla seconda eseguita durante la medesima esecuzione.

In teoria, nel while lo Skeleton non ci rimane.
Perché il Proxy invia prima la stringa per identificare l'operazione, poi gli oggetti utili per eseguire l'operazione (che possono variare di numero) e poi un'ultima stringa per dire allo Skeleton che la comunicazione può considerarsi conclusa.

Forse una possibile soluzione al problema potrebbe essere cambiare il ciclo while da:

Codice:
while (this.socket.isClosed())
a

Codice:
while (true)
ed inserire semplicemente un break dopo aver letto la stringa "END" che identifica la fine delle comunicazioni.
Potrebbe funzionare?

Per quanto riguarda la soluzione che proponi di rimuovere il ciclo while, come potrei gestire il fatto che le varie operazioni hanno bisogno di un numero diverso di oggetti? Con semplici if innestati?
Giobbo è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2015, 07:58   #16
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Sono pressoche' sicuro che il ciclo while e' quello che ti causa problemi, poiche' la condizione di eof e' testata velocemente; dopo di che il flusso di esecuzione torna a bloccarsi sulla lettura di un oggetto, che non verra' mai letto poiche' vai a chiudere la socket dal server.

Non sapevo che il numero di oggetti che vai a leggere fosse variabile. Si, potresti risolvere con if innestati, ma non e' troppo elegante, potresti trovare soluzioni migliori. Tuttavia questo e' un passo successivo, per prima cosa devi essere sicuro di quello che succede nella tua applicazione.

A questo proposito: sembra chiaro che il database non c'entra nulla in questo problema; potresti fare una versione di test, eliminando l'uso del database? Invece di usare il database, potresti semplicemente scrivere "Salvataggio ok" e via dicendo.
In questo modo il debugging sarebbe facilitato ed io (ed altri in questo forum) avrebbero a disposizione una versione molto semplice, che gira immediatamente. Sarebbe piu' facile per tutti, potresti trovare un aiuto decisamente piu' efficace
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2015, 08:05   #17
Giobbo
Member
 
Iscritto dal: Aug 2013
Messaggi: 42
AGGIORNAMENTO: come immaginavo, l'errore è relativo alla creazione di più Thread relativi alla classe Skeleton. Anche se non riesco a capire quale possa essere.
Per fare una prova, ho cambiato questa istruzione (che viene invocata ogni volta che un client tenta di connettersi al server tramite un socket):

Codice:
new Thread(new Skeleton(socket, server)).start();
in questa

Codice:
new Skeleton(socket, server).run();
In pratica, invece di creare un nuovo thread relativo alla classe Skeleton, creo direttamente un nuovo oggetto Skeleton.
In questo modo le varie operazioni vanno a buon fine.
La domanda è: perché?

EDIT: no, come non detto. Mi presenta il medesimo problema.

Ultima modifica di Giobbo : 24-06-2015 alle 08:26.
Giobbo è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2015, 08:45   #18
Giobbo
Member
 
Iscritto dal: Aug 2013
Messaggi: 42
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Sono pressoche' sicuro che il ciclo while e' quello che ti causa problemi, poiche' la condizione di eof e' testata velocemente; dopo di che il flusso di esecuzione torna a bloccarsi sulla lettura di un oggetto, che non verra' mai letto poiche' vai a chiudere la socket dal server.

Non sapevo che il numero di oggetti che vai a leggere fosse variabile. Si, potresti risolvere con if innestati, ma non e' troppo elegante, potresti trovare soluzioni migliori. Tuttavia questo e' un passo successivo, per prima cosa devi essere sicuro di quello che succede nella tua applicazione.

A questo proposito: sembra chiaro che il database non c'entra nulla in questo problema; potresti fare una versione di test, eliminando l'uso del database? Invece di usare il database, potresti semplicemente scrivere "Salvataggio ok" e via dicendo.
In questo modo il debugging sarebbe facilitato ed io (ed altri in questo forum) avrebbero a disposizione una versione molto semplice, che gira immediatamente. Sarebbe piu' facile per tutti, potresti trovare un aiuto decisamente piu' efficace
Ok, ora ho tolto i riferimenti al database (ci sono le prime due righe della classe MainServer che mi son scordato di "togliere" mettendole come commento, ma non dovrebbero creare problemi; nel caso, bastano un paio di //):

https://github.com/Giobbo89/my-facedoor

Testata velocemente funziona senza database.

Il numero di oggetti è variabile in base all'operazione: nella registrazione al momento sono due (user e profile) ma poi saranno tre con l'aggiunta dell'immagine; nel login è solo uno; ecc...
Gli if innestati sarebbero poco eleganti? Quale potrebbe essere una soluzione migliore? Un blocco switch?
Giobbo è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2015, 09:24   #19
Giobbo
Member
 
Iscritto dal: Aug 2013
Messaggi: 42
E, a quanto pare, avevi ovviamente ragione sottovento!
Ho eliminato il ciclo while (oltre al fatto di utilizzare solo gli stream di oggetti per le comunicazioni) e utilizzato per il momento if innestati: a quanto pare sembra funzionare!
Giobbo è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2015, 14:38   #20
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da Giobbo Guarda i messaggi
E, a quanto pare, avevi ovviamente ragione sottovento!
Ho eliminato il ciclo while (oltre al fatto di utilizzare solo gli stream di oggetti per le comunicazioni) e utilizzato per il momento if innestati: a quanto pare sembra funzionare!
Puoi mostrare la parte di codice relativa agli if innestati?
Come dicevamo, sarebbe interessante vedere se si puo' implementare una soluzione alternativa...
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


TCL P80 Ultra: con un display AMOLED opaco è una gioia per gli occhi e per le dita TCL P80 Ultra: con un display AMOLED opaco &egra...
HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio HUAWEI MatePad Air recensione: OLED opaco e tast...
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica NVIDIA RTX Spark: il PC Windows on ARM costruito...
Motorola razr fold, dalla conchiglia al formato a libro. La recensione Motorola razr fold, dalla conchiglia al formato ...
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente Recensione Google Pixel Watch 5: sembra lo stess...
Il satellite spia russo Kosmos 2612 si s...
CrowdStrike mette l’IA contro l’IA: un m...
SAP NOW AI Tour, l'impresa autonoma pass...
Amazon Luna arriva su Prime Video: cloud...
HomeView, Apple pensa già al braccio rob...
Foto reale scartata come fake: Truebees ...
Jim Keller accelera su RISC-V e intellig...
Tutte le migliori offerte Amazon di oggi...
La bancarotta di Character.AI diventa un...
SanDisk Extreme da 128 GB a 31,96€ su Am...
Termoventilatori Dreo e Philips in offer...
Una ASUS ROG Astral RTX 5090 come regalo...
iPad Air 11'' M4 a 999€ con 256 GB su Am...
Sony WH-CH530 su Amazon a 49,90€ in tutt...
OpenCode colpito da un attacco di distil...
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: 20:32.


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