Projet_COO_POO/POO/src/communication/tcp/TCPClient.java

97 lines
2.4 KiB
Java

package communication.tcp;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import observers.ObserverInputMessage;
import observers.ObserverSocketState;
import messages.Message;
public class TCPClient {
private Socket sockTCP;
private ObjectOutputStream output;
private ObjectInputStream input;
private TCPInputThread inputThread;
/**
* Create a TCP client from an existing socket. It will ensure the transmission
* of messages during a session. Two ObjectStream are created in order to
* read/write messages. The ObjectInputStream is given to a thread to read
* continuously the incoming message and allowing the user to write a message
* anytime.
*
* @param sockTCP
* @throws IOException
*/
public TCPClient(Socket sockTCP) throws IOException {
this.sockTCP = sockTCP;
this.output = new ObjectOutputStream(sockTCP.getOutputStream());
this.input = new ObjectInputStream(sockTCP.getInputStream());
this.inputThread = new TCPInputThread(this.input);
}
/**
* Start the thread that will continuously read from the socket.
*/
public void startInputThread() {
this.inputThread.start();
}
/**
* Send a message by writing it in the ObjectOutputStream of the socket
*
* @param message
* @throws IOException
*/
public void sendMessage(Message message) throws IOException {
this.output.writeObject(message);
}
/**
* Set the observer to notify when a message is received
*
* @param o The observer
*/
public void setObserverInputThread(ObserverInputMessage o) {
this.inputThread.setObserverInputMessage(o);
}
/**
* Set the observer to notify when the session is closed/the communication is
* broken.
*
* @param o The observer
*/
public void setObserverSocketState(ObserverSocketState o) {
this.inputThread.setObserverSocketState(o);
}
/**
* Method used when the session is over. Set all attributes' references to null,
* interrupt the inputThread and close the streams and the socket.
*/
public void destroyAll() {
try {
if (!this.sockTCP.isClosed()) {
this.inputThread.setObserverSocketState(null);
this.inputThread.interrupt();
this.input.close();
this.output.close();
this.sockTCP.close();
}
this.inputThread = null;
this.sockTCP = null;
this.output = null;
} catch (Exception e) {
e.printStackTrace();
}
}
}