Tenho esta classe de um cliente socket que recebe e envia objetos, o problema é que posso receber um objeto a qualquer momento, e posso enviar a qualquer momento, não existe uma ordem.
Eu sei que o lock é na leitura do get() com o socket, mas não consigo pensar em outra lógica para poder enviar e receber a qualquer momento sem que um bloqueie o outro.
public class Conexao implements Runnable {
private String dst;
private int porta;
private Socket socket;
private boolean connected;
private Thread listenerInputMessage;
private ControleCliente controle;
/** Creates a new instance of Conexao */
public Conexao(ControleCliente controle, String dst, int porta) {
super();
this.controle = controle;
this.dst = dst;
this.porta = porta;
socket = null;
//connect();
}
private boolean connect() {
try {
socket = new Socket(dst, porta);
setConnected(true);
return true;
} catch (UnknownHostException ex) {
ex.printStackTrace();
return false;
} catch (IOException ex) {
ex.printStackTrace();
return false;
}
}
public void run() {
while(connected) {
if (getSocket() != null) {
get();
}
}
}
public synchronized void get() {
try {
ObjectInputStream oi = new ObjectInputStream(getSocket().getInputStream());
controle.comReceived((Comunicacao) oi.readObject());
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
public synchronized void send(Comunicacao pacote) {
if (!isConnected()) {
connect();
}
try {
ObjectOutputStream oo = new ObjectOutputStream(getSocket().getOutputStream());
oo.writeObject(pacote);
} catch (IOException ex) {
System.out.println("Deu erro no envio da classe"); //debug
ex.printStackTrace();
}
}
public synchronized boolean isConnected() {
return connected;
}
public synchronized void setConnected(boolean connected) {
this.connected = connected;
if (connected) {
listenerInputMessage = new Thread(this);
listenerInputMessage.start();
}
else {
listenerInputMessage.interrupt();
listenerInputMessage = null;
try {
getSocket().close();
setSocket(null);
System.out.println("Desconectado");
}
catch(IOException ioe) {
ioe.printStackTrace();
}
}
}
public synchronized Socket getSocket() {
return socket;
}
public synchronized void setSocket(Socket socket) {
this.socket = socket;
}
}