Salve, utilizzo netbeans 8.0 e sto facendo un programma client-server, il problema che si presenta è quando l'user fa il logout oppure quando voglio eliminare un utente dal database ( lo elimina dal database ma si presenta l'errore), attraverso la gui.
Io penso sia un problema di deserializzazione, poichè invece il login o la registrazione dell'utente funziona. L'errore in consolle è sempre diverso, o alcune volte non compare e va in loop il programma; alcuni di questi errori sono:
codice:
java.io.UTFDataFormatException
at java.io.ObjectInputStream$BlockDataInputStream.readUTFSpan(ObjectInputStream.java:3125)
at java.io.ObjectInputStream$BlockDataInputStream.readUTFBody(ObjectInputStream.java:3050)
at java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2863)
at java.io.ObjectInputStream.readUTF(ObjectInputStream.java:1070)
at java.io.ObjectStreamClass.readNonProxy(ObjectStreamClass.java:671)
at java.io.ObjectInputStream.readClassDescriptor(ObjectInputStream.java:828)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1599)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1515)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1335)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at cavonline_client.Connessione.SocketHandler.run(SocketHandler.java:46)
at java.lang.Thread.run(Thread.java:724)
Exception in thread "Thread-3" java.lang.InternalError
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1590)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1515)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1335)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at cavonline_client.Connessione.SocketHandler.run(SocketHandler.java:46)
at java.lang.Thread.run(Thread.java:724)
java.io.StreamCorruptedException: invalid type code: 49
at java.io.ObjectInputStream$BlockDataInputStream.readBlockHeader(ObjectInputStream.java:2507)
at java.io.ObjectInputStream$BlockDataInputStream.refill(ObjectInputStream.java:2542)
at java.io.ObjectInputStream$BlockDataInputStream.read(ObjectInputStream.java:2614)
at java.io.ObjectInputStream$BlockDataInputStream.readByte(ObjectInputStream.java:2763)
at java.io.ObjectInputStream$BlockDataInputStream.readUTFChar(ObjectInputStream.java:3157)
at java.io.ObjectInputStream$BlockDataInputStream.readUTFBody(ObjectInputStream.java:3054)
at java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2863)
at java.io.ObjectInputStream.readUTF(ObjectInputStream.java:1070)
at java.io.ObjectStreamClass.readNonProxy(ObjectStreamClass.java:671)
at java.io.ObjectInputStream.readClassDescriptor(ObjectInputStream.java:828)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1599)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1515)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1335)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at cavonline_client.Connessione.SocketHandler.run(SocketHandler.java:46)
at java.lang.Thread.run(Thread.java:724)
Non capisco cosa vogliono dire questi molteplici errore, inoltre anche nella consolle del server compare ciò:
codice:
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2597)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1316)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at cavonline_server.Connessione.Server$SocketHandler.run(Server.java:152)
at java.lang.Thread.run(Thread.java:724)
Il pezzo di codice dove effettuo il logout è questo:
codice:
String s = jButton3.getText();
//creato il thread corrente
t = Thread.currentThread();
if(s.equals("Logout")) {
jButton3.setText("Login");
jTabbedPane1.setEnabledAt(3,false);
//status disattivo=0
int valu=0;
clientConn.query(new Messaggio("update Utenti set Status='"+valu+"'where Email='"+email.getText()+"'"));
waitThread();
}
if(s.equals("Login")){
LoginUtente u = new LoginUtente();
u.setVisible(true);
jButton3.setText("Logout");
}
Dove waitThread è:
codice:
private void waitThread(){
try {
t.sleep(500);
} catch (InterruptedException ex) {
Logger.getLogger(LoginUtente.class.getName()).log(Level.SEVERE, null, ex);
}
}
Questa è la classe SocketHandler del client:
codice:
public class SocketHandler implements Runnable {
private static ObjectInputStream in;
public SocketHandler(Socket sock) {
try {
SocketHandler.in = new ObjectInputStream(sock.getInputStream());
} catch (IOException ex) {
Logger.getLogger(SocketHandler.class.getName()).log(Level.SEVERE, null, ex);
}}
@Overridepublic void run() {
try {
Messaggio message = null;
System.out.println("Messaggio arrivato");
while((message = (Messaggio) in.readObject()) != null) {
ClientConn.receive(message);
} } catch (IOException | ClassNotFoundException ex) {
Logger.getLogger(SocketHandler.class.getName()).log(Level.SEVERE, null, ex);
}}
public void interrupt() {
try {
SocketHandler.in.close();
} catch (IOException ex) {
Logger.getLogger(SocketHandler.class.getName()).log(Level.SEVERE, null, ex);
}}}
Mentre questa è la classe "Messaggio":
codice:
public class Messaggio implements Serializable{
//client invia un messaggio con stringa
public String sql;
//dopo dal server riceverà un messaggio con un vector (database)
public Vector<String> risultati = new Vector();
public Messaggio(String sql) {
this.sql = sql;
}}
Soprattutto l'errore rimanda sempre a questa riga, dicendo che non è possibile fare il cast con Messaggio, eppure nei casi del login e registrazione funziona... :
codice:
while((message = (Messaggio) in.readObject()) != null) {
Mi sta facendo impazzire questo problema
, spero riusciate a risolverlo, grazie