package clueless.controller.client;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.UUID;
import clueless.controller.GameController;
import clueless.events.MessageEvent;
import clueless.messaging.Message;
import clueless.model.Player;
/**
* Class for Clueless game clients.
*
* @author T
*/
public class CluelessClient extends Thread {
private boolean keepRunning = true;
private Socket clientSocket = null;
private ObjectInputStream input = null;
private ObjectOutputStream output = null;
private final int TIME_OUT = 5000; //milliseconds
private GameController controller;
private Player player;
public CluelessClient(GameController controller, InetAddress ipAddress, int port) throws IOException{
this.controller = controller;
try {
clientSocket = new Socket();
clientSocket.connect(new InetSocketAddress(ipAddress, port), TIME_OUT);
clientSocket.setReuseAddress(true);
input = new ObjectInputStream(new DataInputStream(clientSocket.getInputStream()));
output = new ObjectOutputStream(new DataOutputStream(clientSocket.getOutputStream()));
} catch (SocketTimeoutException e) {
System.err.println("Connection Timed Out: " +e.getMessage());
e.printStackTrace();
} catch (IOException e) {
System.err.println("IOException creating client: "+e.getMessage());
e.printStackTrace();
}
start();
}
@Override
public void run(){
/** Keep listening for messages from the server */
while(keepRunning && clientSocket.isConnected()) {
/** Pass received messages to the controller */
controller.fireMessageEvent(new MessageEvent(this, receive()));
}
}
/**
* Sends a message to server
* @param message - the message to send
*/
public void send(Message message){
if(output != null){
try {
output.writeObject(message);
} catch (IOException e) {
System.err.println("IOException while trying to send message: "+e.getMessage());
e.printStackTrace();
}
}
}
/**
* Receives a message from server
* @return message received from server
*/
public Message receive() {
Message message = null;
try {
input.read();
message = (Message)input.readObject();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return message;
}
public void setPlayer(Player player) {
this.player = player;
}
public Player getPlayer(){
return player;
}
/**
* Shuts down all sending and receiving and closes the socket.
*/
public void disconnect(){
keepRunning = false;
try {
output.close();
input.close();
clientSocket.close();
} catch (IOException e) {
System.err.println("Error closing Clueless client.");
e.printStackTrace();
}
}
}