import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.io.*;
import java.net.*;
import javax.swing.JOptionPane;
/**
* simple chat client
*/
public class Client implements Runnable {
String servAddr;
int servPort;
Socket s;
public static void main(String[] args) throws IOException {
Client client = new Client();
}
protected ObjectInputStream inputStream;
protected ObjectOutputStream outputStream;
protected Thread thread;
public Client(boolean validate){}
public Client() {
getConfiguration();
connectToServer();
initUI();
}
synchronized boolean connectToServer(){
try
{
System.out.println("Connecting to " + servAddr + " (port " + servPort
+ ")...");
InetAddress addr = InetAddress.getByName(servAddr);
s = new Socket(addr, servPort);
}
catch( UnknownHostException e )
{
JOptionPane.showMessageDialog( null,"Host Not Found, Reconfigure...","Host Lookup Error",JOptionPane.ERROR_MESSAGE );
return false;
}
catch( IOException e )
{
JOptionPane.showMessageDialog( null,"Server Not Found, Check If Server Exists...","Socket Error",JOptionPane.ERROR_MESSAGE );
System.exit(0);
return false;
}
try
{
this.outputStream = new ObjectOutputStream((s.getOutputStream()));
this.inputStream = new ObjectInputStream((s.getInputStream()));
}
catch( IOException e )
{
JOptionPane.showMessageDialog( null,"Cannot Create Data Stream, Closing Client...","Data Stream Error",JOptionPane.ERROR_MESSAGE );
try
{
s.close();
}
catch( IOException io_e )
{}
return false;
}
thread = new Thread(this);
thread.start();
return true;
}
/**
* main method. waits for incoming messages.
*/
public void run() {
try {
while (true) {
try {
Object msg = inputStream.readObject();
handleIncomingMessage(msg);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
thread = null;
try {
outputStream.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
protected synchronized void getConfiguration() {
try {
char[] buffer = new char[255];
FileReader configFile = new FileReader("clientConfig.cfg");
configFile.read(buffer);
servAddr = String.copyValueOf(buffer);
String[] temp = servAddr.split(";");
servAddr = temp[0];
servPort = Integer.parseInt(temp[1]);
} catch (FileNotFoundException fnf_e) {
JOptionPane.showMessageDialog(null,
"Configuration File Not Found, Using Defaults",
"Configuration File Missing", JOptionPane.ERROR_MESSAGE);
servPort = 1665;
servAddr = "localhost";
} catch (IOException io_e) {
JOptionPane.showMessageDialog(null,
"Error Reading Configuration File, Using Defaults",
"Configuration Error", JOptionPane.ERROR_MESSAGE);
servPort = 1665;
servAddr = "localhost";
}
}
/**
* decides what to do with incoming messages
*
* @param msg
* the message (Object) received from the sockets
*/
protected void handleIncomingMessage(Object msg) {
if (msg instanceof TextMessage) {
fireAddLine((TextMessage)msg);
}
}
public void send(String line) {
send(new TextMessage(line));
}
public void send(TextMessage msg) {
try {
outputStream.writeObject(msg);
outputStream.flush();
} catch (IOException ex) {
ex.printStackTrace();
thread.stop();
}
}
/**
* listener-list for the observer pattern
*/
protected ArrayList listeners = new ArrayList();
/**
* addListner method for the observer pattern
*/
public void addLineListener(ChatLineListener listener) {
listeners.add(listener);
}
/**
* removeListner method for the observer pattern
*/
public void removeLineListener(ChatLineListener listner) {
listeners.remove(listner);
}
/**
* fire Listner method for the observer pattern
*/
public void fireAddLine(TextMessage msg) {
for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
ChatLineListener listener = (ChatLineListener) iterator.next();
listener.newChatLine(msg);
}
}
public void stop() {
thread.stop();
}
public void initUI(){
}
}