import java.awt.Color;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
/**
* simple chat client
*/
public class Client implements Runnable {
protected ObjectInputStream inputStream;
protected ObjectOutputStream outputStream;
protected Thread thread;
protected StartingGui gui;
protected String name;
public Client(String host, int port,String name, StartingGui gui) {
this.gui = gui;
this.name = name;
try {
System.out.println("Connecting to " + host + " (port " + port
+ ")...");
Socket s = new Socket(host, port);
this.outputStream = new ObjectOutputStream((s.getOutputStream()));
this.inputStream = new ObjectInputStream((s.getInputStream()));
thread = new Thread(this);
thread.start();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* main method. waits for incoming messages.
*/
public void run() {
try {
while (true) {
try {
Object msg = inputStream.readObject();
handleIncomingMessage(msg);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
thread = null;
try {
outputStream.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
/**
* decides what to do with incoming messages
*
* @param msg
* the message (Object) received from the sockets
*/
protected void handleIncomingMessage(Object msg) {
if (msg instanceof AuthMessage)
{
gui.checkPassword(((AuthMessage) msg).getContent());
}
if (msg instanceof TextMessage)
{
fireAddLine(((TextMessage) msg).getSender() + ": ", ((TextMessage) msg).getContent()
+ "\n", ((TextMessage) msg).getColor());
}
}
public void send(String from, String line, Color color) {
send(new TextMessage(from, line, color));
}
public void send(Message msg) {
try {
outputStream.writeObject(msg);
outputStream.flush();
} catch (IOException ex) {
ex.printStackTrace();
thread.stop();
}
}
/**
* listener-list for the observer pattern
*/
private ArrayList listeners = new ArrayList();
/**
* addListner method for the observer pattern
*/
public void addListener(ChatListener listener) {
listeners.add(listener);
}
/**
* removeListner method for the observer pattern
*/
public void removeListener(ChatListener listener) {
listeners.remove(listener);
}
/**
* fire Listener method for the observer pattern
*/
public void fireAddLine(String sender, String line, Color color) {
for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
ChatListener listener = (ChatListener) iterator.next();
listener.newChatLine(sender, line, color);
}
}
public void stop() {
thread.stop();
}
}