77 rader
1,6 KiB
Java
77 rader
1,6 KiB
Java
package communication.tcp;
|
|
|
|
import java.io.IOException;
|
|
import java.io.ObjectInputStream;
|
|
import observers.ObserverInputMessage;
|
|
import observers.ObserverSocketState;
|
|
|
|
public class TCPInputThread extends Thread {
|
|
|
|
private ObjectInputStream input;
|
|
private boolean running;
|
|
private ObserverInputMessage obsInput;
|
|
private ObserverSocketState obsState;
|
|
|
|
/**
|
|
* Create the thread used to read the messages
|
|
*
|
|
* @param input The ObjectInputStream to read data from
|
|
*/
|
|
protected TCPInputThread(ObjectInputStream input) {
|
|
this.input = input;
|
|
this.running = true;
|
|
}
|
|
|
|
@Override
|
|
public void run() {
|
|
|
|
while (this.running) {
|
|
try {
|
|
Object o = this.input.readObject();
|
|
// Notify the observer a message was received
|
|
this.obsInput.updateInput(this, o);
|
|
|
|
} catch (IOException | ClassNotFoundException e) {
|
|
this.interrupt();
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void interrupt() {
|
|
// Stop the thread
|
|
this.running = false;
|
|
// Close the stream and the socket
|
|
|
|
if (this.obsState != null) {
|
|
// Send an update to the controller
|
|
this.obsState.updateSocketState(this, true);
|
|
}
|
|
|
|
// Set every attribute to null so they're collected by the GC
|
|
this.obsInput = null;
|
|
this.obsState = null;
|
|
this.input = null;
|
|
}
|
|
|
|
/**
|
|
* Set the observer to notify when a message is received
|
|
*
|
|
* @param o The observer
|
|
*/
|
|
protected void setObserverInputMessage(ObserverInputMessage o) {
|
|
this.obsInput = o;
|
|
}
|
|
|
|
/**
|
|
* Set the observer to notify when the session is cut/closed.
|
|
*
|
|
* @param o The observer
|
|
*/
|
|
protected void setObserverSocketState(ObserverSocketState o) {
|
|
this.obsState = o;
|
|
}
|
|
|
|
}
|