Questa è la classe che si occupa del rapporto col server (ancora non del tutto completa):
codice:
package jcallremember.client;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.sql.ResultSet;
import jcallremember.libreria.Credenziali;
import jcallremember.libreria.Operazioni;
/**
*
* Questa Classe implementa una connessione al server
*/
public class ClientConnection {
private Socket socket;
private InetAddress address;
private OutputStream os;
private InputStream is;
private final int serverPort=40000;
private Credenziali user_and_pass;
/**
* Verifica se l'oggetto è connesso a un server
* @return true in caso affermativo , false altrimenti
*/
public boolean isConnect(){
return this.socket.isConnected();
}
/**
* Invia al server le informazioni di login e si connette
* @param login
* @throws java.net.ConnectException
* @throws UnknownHostException
* @throws IOException
*/
public void connect(Credenziali login)
throws java.net.ConnectException,
UnknownHostException, IOException{
this.address=InetAddress.getLocalHost();
this.socket=new Socket(address,this.serverPort);
Boolean isConnect;
this.os=this.socket.getOutputStream();
this.is=this.socket.getInputStream();
ObjectOutputStream obs = new ObjectOutputStream(this.os);
obs.writeObject(login);
obs.flush();
ObjectInputStream ois = new ObjectInputStream(this.is);
isConnect = ois.readBoolean();
if(!isConnect){
throw new java.net.ConnectException("Username o Password"
+ " inesatte!");
}
else this.user_and_pass=login;
}
public ResultSet downloadImpegniDelGiorno() throws
IOException, ClassNotFoundException{
String query="Select * from Cliente where username= "+
this.user_and_pass.getUsername();
ObjectOutputStream obs=new ObjectOutputStream(this.os);
obs.writeObject(Operazioni.DOWNLOAD);
obs.flush();
obs.writeObject(query);
obs.flush();
ObjectInputStream ois=new ObjectInputStream(this.is);
ResultSet rowdata=(ResultSet)ois.readObject();
return rowdata;
}
}
Questo è l'actionperformed relativo a un form (ancora non completo e senza gestione del problema
dell'edt con l'I/O):
codice:
package jcallremember.client;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import jcallremember.libreria.Credenziali;
/**
* @author Pasquale Calorigero
*/
public class LoginHandler implements ActionListener {
private final JFormattedTextField Userfield;
private final JPasswordField pwdField;
public LoginHandler(JFormattedTextField Userfield,JPasswordField pwdField){
this.Userfield=Userfield;
this.pwdField=pwdField;
}
@Override
public void actionPerformed(ActionEvent e) {
//creo una connessione col Server
String pass=new String(this.pwdField.getPassword());
Credenziali login=new Credenziali(this.Userfield.getText(),
pass );
try {
MyConnection.getInstance().connect(login);
MyConnection.getInstance().downloadImpegniDelGiorno();
new MainMenu().setup();
}catch(java.net.ConnectException ex){
JOptionPane.showMessageDialog(null, ex.getMessage(),"Errore"
, JOptionPane.ERROR_MESSAGE);
}catch (IOException | ClassNotFoundException ex) {
Logger.getLogger(LoginHandler.class.getName()).log(Level.SEVERE,
null, ex);
}
}
}
E infine Questo è lo swingworker che vorrei utilizzare nell'action performed onde evitare l'I/O
(ancora non completo):
codice:
package jcallremember.client;
import javax.swing.SwingWorker;
import jcallremember.libreria.Credenziali;
/**
*
* @author Pasquale Calorigero
*/
public class SwingWorkerConnect extends SwingWorker <Void,Void> {
private Credenziali login;
public SwingWorkerConnect(Credenziali login){
this.login=login;
}
@Override
protected Void doInBackground() throws Exception {
MyConnection.getInstance().connect(login);
}
}
Questo è il singleton per la classe ClientConnection
codice:
package jcallremember.client;
/**
*
* @author Pasquale Calorigero
* Implementa il pattern Singleton
*/
public class MyConnection {
private static ClientConnection connessione=null;
private MyConnection(){};
/**
*
* @return un istanza di ClientConnection connessa o meno a un server
*/
public synchronized static ClientConnection getInstance(){
if(MyConnection.connessione==null)
connessione=new ClientConnection();
return MyConnection.connessione;
}
}
Che ne pensate?
Inoltre mi chiedo quella throws sul metodo dobackground nella classe che estende swingworker, a chi rimanda la gestione dell'eccezione ?
Dovrei far si che la gestione dell'eccezione venga rimandata all'interno dell'actionPerformed , come posso fare?