package org.buzztroll.mud; import java.lang.*; import java.net.*; import java.io.*; import java.util.*; public class MudConnection implements Runnable { protected Socket sock; protected String hostname; protected int port; protected Thread connectThread; protected Thread readerThread; protected Thread keepAliveThread; protected DataOutputStream dos; protected boolean connected = false; protected boolean keepAlive = false; protected List listeners; protected BufferedReader dis; private final int PING_TIME = 60 * 1000 * 10; public MudConnection( String hostname, int port, MudConnectionListener l) { this.hostname = hostname; this.port = port; addListener(l); } public void addListener(MudConnectionListener listener) { if (this.listeners == null) { this.listeners = new ArrayList(); } this.listeners.add(listener); } public void removeListener(MudConnectionListener listener) { if (this.listeners != null) { this.listeners.remove(listener); } } public void connect( String username, String password) throws Exception { this.sock = new Socket(this.hostname, this.port); this.sock.setKeepAlive(true); this.connected = true; dos = new DataOutputStream(sock.getOutputStream()); if(username != null && password != null) { String tempS = new String("connect "+username+" "+password); sendLine(tempS); } dis = new BufferedReader( new InputStreamReader(sock.getInputStream())); this.connected = true; readerThread = new Thread(this); readerThread.start(); // keepAliveThread = new Thread(this); // keepAliveThread.start(); } public void close() throws Exception { this.sock.close(); } public void sendLine( String msg) { try { if(msg != null && !msg.equals("")) { dos.writeBytes(msg); dos.writeBytes("\r\n"); dos.flush(); } } catch(Exception e) { System.err.println("1 " + e); for (int i=0;i<this.listeners.size();i++) { MudConnectionListener listener = (MudConnectionListener)this.listeners.get(i); listener.disconnected(); } connected = false; } } public void run() { Thread thread; String tempS; thread = Thread.currentThread(); try { if(thread == keepAliveThread) { while(connected) { try { thread.sleep(this.PING_TIME); } catch(Exception e) {} sendLine("mu me ping..."); } } else if(thread == readerThread) { tempS = dis.readLine(); while(connected && tempS != null) { for (int i=0;i<this.listeners.size();i++) { MudConnectionListener listener = (MudConnectionListener)this.listeners.get(i); listener.messageReceived(tempS); } tempS = dis.readLine(); } } else if(thread == connectThread) { while(!connected) { try { thread.sleep(this.PING_TIME); } catch(Exception e) {} for (int i=0;i<this.listeners.size();i++) { MudConnectionListener listener = (MudConnectionListener)this.listeners.get(i); listener.connectTic(); } } } } catch(Exception e) { e.printStackTrace(); System.err.println("2 " + e); for (int i=0;i<this.listeners.size();i++) { MudConnectionListener listener = (MudConnectionListener)this.listeners.get(i); listener.disconnected(); } connected = false; } } }