package vooga.rts.networking.client; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.logging.Level; import java.util.logging.Logger; import util.logger.LoggerManager; import vooga.rts.networking.NetworkBundle; import vooga.rts.networking.communications.IMessage; /** * Provides client-side methods for connecting to the multiplayer server. * In this case the client is the Arcade and the Game. * * * @author srwareham * @author David Winegar * */ public class Client extends Thread implements IClient { private static final int PORT = 55308; private static final String HOST = "login.cs.duke.edu"; private ObjectInputStream myInput; private ObjectOutputStream myOutput; private Socket mySocket; private String myHost = HOST; private int myPort = PORT; private IMessageReceiver myReceiver; private boolean myRunning = false; private Logger myLogger; /** * Instantiates the client and starts the connection. * * @param receiver to send messages to */ public Client (IMessageReceiver receiver) { myReceiver = receiver; LoggerManager log = new LoggerManager(); myLogger = log.getLogger(); try { mySocket = new Socket(myHost, myPort); myOutput = new ObjectOutputStream(mySocket.getOutputStream()); myInput = new ObjectInputStream(mySocket.getInputStream()); } catch (UnknownHostException e) { myLogger.log(Level.WARNING, NetworkBundle.getString("InitialConnectionFailed")); } catch (IOException e) { myLogger.log(Level.WARNING, NetworkBundle.getString("InitialConnectionFailed")); } start(); } /** * Creates the sockets and streams for this client */ public void run () { myRunning = true; while (myRunning) { try { Object object = myInput.readObject(); if (object instanceof IMessage) { myReceiver.getMessage((IMessage) object); } } catch (ClassNotFoundException e) { myLogger.log(Level.WARNING, NetworkBundle.getString("ConnectionFailedClassEx")); } catch (IOException e) { myLogger.log(Level.WARNING, NetworkBundle.getString("ConnectionFailedIO")); myRunning = false; } } } @Override public void sendMessage (IMessage message) { try { myOutput.writeObject(message); } catch (IOException e) { myLogger.log(Level.WARNING, NetworkBundle.getString("ExceptionServer") + e); } } @Override public void setMessageReceiver (IMessageReceiver messageReceiver) { myReceiver = messageReceiver; } @Override public void closeConnection () { myRunning = false; try { myOutput.close(); myInput.close(); mySocket.close(); } catch (IOException e) { myLogger.log(Level.WARNING, NetworkBundle.getString("ClosingConnectionsFailed")); } myLogger.log(Level.INFO, NetworkBundle.getString("ClosedConnection")); } }